.TITLE TTATT .IDENT /06.15/ ; ; Copyright (c) 1995 by Mentec, Inc., U.S.A. ; All rights reserved ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED ; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE ; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS ; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR ; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO AND ; OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERED. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ; ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL. ; ; ; 09-FEB-78 PETER WANNHEDEN ; ; PREVIOUSLY MODIFIED BY: ; ; P. WANNHEDEN ; C. F. SPITZ ; D. R. DONCHIN ; B. S. MCCARTHY ; T. LEKAS ; S. C. ADAMS ; R. S. PHILPOTT ; ; ; MODIFICATION HISTORY: ; ; L. KOGAN 4-APR-86 6.04 ; LK709 -- FIX CONDITIONALS WHEN SF.SMC IS DEFINED AND ; SF.GMC IS NOT DEFINED ; ; L. KOGAN 18-JUN-86 6.05 ; LK710 -- INCLUDE 7-BIT CHARACTER LENGTH SUPPORT ; ; S.C. ADAMS 14-JUNE-86 6.06 ; SA459 -- FIX COMMENT IN MCOOB ; ; S. R. CLOUTIER 23-JUN-86 6.07 ; ADD CALL TO LAT PORT DRIVER, ON DETACH, IF TERMINAL IS A ; LAT APPLICATION TERMINAL. ; ; S.C. ADAMS 5-AUG-86 6.08 ; SA464 -- ADD LAT 5.1 SUPPORT ; ; S.C. ADAMS 5-AUG-86 6.09 ; SA465 -- REMOVE RESTRICTION THAT TERMINAL CANNOT BE ATTACHED ; FOR AST NOTIFICATION TO SET OTHER NOTIFICATION CHARACTERISTICS ; ; S. R. CLOUTIER 7-AUG-86 6.10 ; SRC SUPPLY STATUS IE.DNR IN ROUTINE PPHNG BEFORE CALLING KILLO1 ; ; CHECK TO SEE IF I/O PACKET HAS BEEN TAKEN BY LAT PROCESS ; IN PPHNG BEFORE COMPLETING I/O ; ; S. R. CLOUTIER 9-SEP-86 6.11 ; SRC MAKE CORRECTIONS TO MCMAP AND MCQDP LAT APPLICATION TERMINAL ; ROUTINES ; ; T. M. SCHOELLER 10-DEC-86 6.12 ; TMS050 -- REMAP APR5 BEFORE CALLING CKTAB VIA CHANGING THE STACK ; ; L. KOGAN 26-FEB-87 6.13 ; LK722 -- DO NOT KILL I/O ON LOCAL LINES AFTER IO.HNG ; ; S.C. ADAMS 12-JUN-87 6.14 ; SA473 -- CHECK THAT LAT PROCESS IS INSTALLED BEFORE GET OR SET ; CHARACTERSITICS ; ; Modified for RSX-11M-PLUS V4.6 by: ; ; D. Carroll 14-Nov-1995 6.15 (CFS.34881) ; DC416 -- Correct handling for user port when setting remote ; characteristics. If T$$UMD is defined, handle remote ; characteristics the same as other controllers which ; support modem characteristics. This is only included ; if T$$USP is also defined, which is standard. ; ; ;+ ; ****** T T A T T ****** ; ; THIS MODULE CONTAINS THE ROUTINES TO PROCESS I/O REQUESTS WITH THE ; FOLLOWING FUNCTION CODES: ; IO.ATT, IO.DET, IO.HNG, IO.GTS, SF.GMC, SF.SMC ; MOST OF THIS PROCESSING IS DONE WHEN THE I/O REQUEST IS REMOVED FROM THE ; TERMINAL'S REQUEST QUEUE. HOWEVER, IO.GTS AND IO.GMC ARE NEVER PUT IN THE ; QUEUE SO THEIR PROCESSING ROUTINE IS CALLED IMMEDIATELY FROM TTINI. ALSO ; CONTAINED IN THIS MODULE IS THE ROUTINE FOR DEALLOCATING AST CONTROL BLOCKS. ; IT IS CALLED FROM THE EXECUTIVE WHEN AN AST HAS BEEN DEQUEUED AND EFFECTED. ;- ; .SBTTL .MCALLS AND SYMBOL DEFINITIONS .IF DF T$$TSA!T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB .MCALL EVNDF$,PKTDF$ EVNDF$ ;DEFINE TSA EVENT PACKET OFFSETS PKTDF$ ;DEFINE AST CONTROL BLOCK SYMBOLS .ENDC ;T$$TSA!T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB .IF NDF R$$MPL .MCALL HWDDF$,SCBDF$ HWDDF$ ;DEFINE KINAR5 SCBDF$ ;DEFINE S.DMCS .ENDC .IF DF T$$GTS .MCALL TTSYM$ TTSYM$ ;DEFINE F1.XXX AND F2.XXX SYMBOLS ; ; DEFINE TERMINAL SUPPORT WORDS RETURNED BY AN IO.GTS REQUEST ; ; ALWAYS SUPPORTED OPTIONS: ; TSP1 = F1.ACR!F1.BUF!F1.CCO!F1.HLD!F1.LWC!F1.RNE TSP1 = TSP1!F1.RST!F1.SYN!F1.TRW!F1.UTB!F1.VBF ; TSP2 = F2.FDX!F2.SFF ; ; CONDITIONALLY SUPPORTED OPTIONS: ; .IIF DF T$$BTW TSP1 = TSP1!F1.BTW .IIF DF T$$CCA TSP1 = TSP1!F1.UIA .IIF DF T$$ESC TSP1 = TSP1!F1.ESQ .IIF DF T$$RPR TSP1 = TSP1!F1.RPR .IIF DF T$$RUB TSP1 = TSP1!F1.RUB ; .IIF DF T$$GMC TSP2 = TSP2!F2.GCH .IIF DF T$$SMC TSP2 = TSP2!F2.SCH .IIF DF T$$CUP TSP2 = TSP2!F2.CUP .IIF DF T$$EIO TSP2 = TSP2!F2.EIO .IIF DF T$$TSA TSP2 = TSP2!F2.NCT .ENDC ;T$$GTS .PAGE .SBTTL PPATT - POST-QUEUE PROCESSING FOR ATTACH REQUESTS ; ;+ ; **-PPATT - POST-QUEUE PROCESSING FOR ATTACH REQUESTS ; ; THIS ROUTINE IS DISPATCHED TO FROM TTINI AFTER AN IO.ATT REQUEST HAS ; BEEN DEQUEUED FOR A TERMINAL. ALWAYS SAVE THE USER-DEFINED TERMINAL ; ID AND PROCESS IO.ATT SUBFUNCTIONS. ; ; INPUTS: ; R5 => U.TSTA OF TERMINAL UCB ; R4 => UCBX FOR TERMINAL (GUARANTEED TO EXIST AND BE MAPPED) ; R3 => CURRENT I/O PACKET ; ; OUTPUTS: NONE. ; ; REGISTERS MODIFIED: R0, R1, R2, R3, R4 ;- ; ;MOVE THIS TO APR6 .IF NDF T$$OVL .PSECT MAP6 .ENDC ;NDF T$$OVL .IF DF T$$ONI ;IF AN OVERLAID NON I/D SYSTEM $DALED: .WORD 0 ;THIS WILL BE INITIALIZED BY TTDAT CODE ;THIS MUST BE THE FIRST WORD IN THE OVERLAY .IF DF T$$GMC!T$$SMC ; ; TABLE OF CHARACTERISTIC CODES FOR GET MULTIPLE CHARACTERISTICS ; FUNCTION (SF.GMC) AND SET MULTIPLE CHARACTERISTICS FUNCTION (SF.SMC). ; ; EACH RECOGNIZED CODE HAS A 1-WORD ENTRY IN THE TABLE. ; THIS WORD CONTAINS ONE OF THE FOLLOWING: ; ; 1. IF THE WORD NOT = 0 AND BIT 15 = 0: ; LOW BYTE = A BITMASK THAT MAPS THE DESIRED CHARACTERISTIC ; VALUE IN THE PROPER BYTE IN THE UCB. BITS ARE SET FOR ; RELEVANT BITS IN THE UCB BYTE. ; HIGH BYTE = OFFSET FROM START OF THE UCB TO THE BYTE ; THAT CONTAINS THE DESIRED CHARACTERISTIC. ; ; 2. IF BIT 15 = 1: ; THE WORD IS THE ADDRESS OF A SUBROUTINE THAT HANDLES ; THIS PARTICULAR CHARACTERISTIC. ; (ALL VIRTUAL ADDRESSES IN THE DRIVER ARE 120000 OR HIGHER). ; ; 3. IF THE WHOLE WORD = 0: ; THIS CHARACTERISTIC IS NOT RECOGNIZED BY SF.GMC OR SF.SMC. ; ; ; DEFINE MACRO TO GENERATE TABLE ENTRIES ; .MACRO MCGEN NAME,OFS,BM .IF LE NAME-MCHI .=MCTAB+<2*> .IF NB BM .IF LE BM-377 .BYTE BM,OFS .IFF .BYTE BM/400,OFS+1 .ENDC .IFF .WORD OFS .ENDC .IFF .ERROR ;ILLEGAL CHARACTERISTIC .ENDC .ENDM MCGEN ; MCHI == TC.MAX-1 ;HIGHEST RECOGNIZED CHARACTERISTIC ; MCTAB:: .REPT MCHI .WORD 0 ;INITIALIZE WHOLE TABLE TO ZEROS .ENDR MCGEN TC.WID,U.CW4,377 ;NUMBER OF COLUMNS MCGEN TC.LPP,U.TLPP,377 ;NUMBER OF LINES PER PAGE .IF DF D$$H11!D$$Z11!D$$V11 MCGEN TC.RSP,MCRSP ;RECEIVE SPEED MCGEN TC.XSP,MCXSP ;TRANSMIT SPEED MCGEN TC.PAR,MCPAR ;PARITY GENERATION AND CHECKING MCGEN TC.EPA,MCEPA ;PARITY SENSE MCGEN TC.CLN,MCCLN ;7-BIT CHARRACTER LENGTH .IF DF T$$MOD MCGEN TC.ASP,MCASP ;ANSWER SPEED MCGEN TC.ABD,U.TSTA+6,S4.ABD ;AUTO-BAUD SPEED DETECT .ENDC ;T$$MOD .ENDC ;D$$H11!D$$Z11!D$$V11 MCGEN TC.ISL,U.UNIT,377 ;SUB-LINE ON CONTROLLER MCGEN TC.TTP,MCTTP ;TERMINAL TYPE MCGEN TC.SCP,U.CW2,U2.CRT ;SCOPE MCGEN TC.HFL,U.TSTA+6,S4.HFL ;HORIZONTAL FILL REQUIREMENT MCGEN TC.VFL,U.TSTA+6,S4.VFL ;VERTICAL FILL REQUIREMENT MCGEN TC.HFF,U.TSTA+6,S4.HFF ;HARDWARE FORM-FEED MCGEN TC.HHT,U.TSTA+6,S4.HHT ;HARDWARE TAB MCGEN TC.ACR,U.TSTA+4,S3.ACR ;AUTOMATIC CR-LF ON LONG LINES MCGEN TC.PPT,U.TSTA+4,S3.PPT ;PRINTER-PORT MCGEN TC.SMR,U.CW2,U2.LWC ;LOWERCASE INPUT ENABLED .IF DF T$$ESC MCGEN TC.ESQ,U.CW2,U2.ESC ;ESCAPE SEQUENCES RECOGNIZED .ENDC ;T$$ESC .IF DF T$$MOD MCGEN TC.DLU,MCRMT ;DIAL-UP LINE .ENDC MCGEN TC.HLD,U.CW2,U2.HLD ;HOLD-SCREEN MODE MCGEN TC.NEC,U.TSTA+4,S3.NEC ;NO-ECHO MCGEN TC.SLV,U.CW2,U2.SLV ;SLAVED TERMINAL MCGEN TC.PRI,U.CW2,U2.PRV ;PRIVILEGED TERMINAL MCGEN TC.FDX,U.TSTA+4,S3.FDX ;FULL DUPLEX MCGEN TC.PTH,U.TSTA+4,S3.PTH ;PASS-THROUGH MODE IS ENABLED MCGEN TC.BIN,MCBIN ;READ-PASS-ALL MCGEN TC.8BC,U.TSTA+4,S3.8BC ;8 BIT CHARACTERS PASSED ON READ MCGEN TC.TBF,MCTBF ;TYPE-AHEAD BUFFER ACTIVE COUNT MCGEN TC.CTS,MCCTS ;CONTROL-S STATUS MCGEN TC.HSY,MCHSY ;HOST/TERMINAL SYNCHRONIZATION MCGEN TC.ANI,U.TSTA+6,S4.ANI ;ANSI CRT MCGEN TC.AVO,U.TSTA+6,S4.AVO ;ADVANCED VIDEO MCGEN TC.BLK,U.TSTA+6,S4.BLK ;BLOCK MODE MCGEN TC.DEC,U.TSTA+6,S4.DEC ;DEC CRT MCGEN TC.EDT,U.TSTA+6,S4.EDT ;EDIT MODE MCGEN TC.RGS,U.TSTA+6,S4.RGS ;REGIS MCGEN TC.SFC,U.TSTA+6,S4.SFC ;SOFT CHARACTERS ; .IF DF R$$MPL!A$$CLI .IF DF C$$CTC MCGEN TC.TLC,U.TSTA+4,S3.CTC ;CONTROL-C NOTIFICATION .ENDC ;C$$CTC MCGEN TC.NBR,U.MUP,UM.NBR ;NOBROADCAST .ENDC ;R$$MPL!A$$CLI .IF DF T$$ACD MCGEN TC.ACD,MCACD ;ANCILLARY CONTROL DRIVER (ACD) .ENDC ;T$$ACD MCGEN TC.RAT,U.TSTA+4,S3.TAB ;READ-AHEAD TYPE .IF DF T$$SER MCGEN TC.TBM,U.MUP,UM.SER ;TYPEAHEAD BUFFER MODE (TASK OR CLI) .ENDC ;T$$SER ; .IF DF T$$OOB MCGEN TC.OOB,MCOOB ;OUT-OF-BAND/HELLO/INCLUDE CHARACTERS .ENDC ;T$$OOB .IF DF T$$ICS MCGEN TC.ICS,MCICS ;NOTIFY OF CHANGE IN TABUF ;(INPUT COUNT STATE) .ENDC ;TT$ICS .IF DF T$$SCA MCGEN TC.SSC,MCSSC ;SPECIFY SWITCH CHARACTERS MCGEN TC.TMM,MCTMM ;EXIT TERMINAL MANAGEMENT MODE .ENDC ;T$$SCA MCGEN TC.TSY,MCTSY ;OUTPUT FLOW CONTROL .IF DF T$$MHU ;MODEM HANG-UP NOTIFY MCGEN TC.MHU,MCMHU ;REQUEST MODEM HANG-UP NOTIFICATION .ENDC ;T$$MHU .IF DF T$$LTH&M$$NET MCGEN TC.QDP,MCQDP ;GET QUEUE DEPTH AND LAT CONNECT STATUS MCGEN TC.MAP,MCMAP ;SET UP LAT MAPPING .ENDC ;T$$LTH&M$$NET .=MCTAB+<2*MCHI> ;END OF TABLE ; ; .ENDC ;T$$GMC!T$$SMC .ENDC ; T$$ONI PPATT:: MOVB I.PRM+2(R3),U.TTID(R4) ;SAVE USER-DEFINED TERMINAL ID .IF DF T$$ESC BIT #TF.ESQ,I.FCN(R3) ;TASK WANT ESCAPE SEQUENCES? .IF DF T$$CCA BEQ 10$ ;IF EQ, NO...SKIP .IFF ;T$$CCA BEQ ADHSUC ;COMPLETE SUCCESSFUL ATTACH .ENDC ;T$$CCA BIS #S3.RES,4(R5) ;REMEMBER TO PARSE THEM 10$: .ENDC ;T$$ESC .IF DF T$$CCA BIT #TF.AST,I.FCN(R3) ;ATTACH FOR UNSOLICITED INPUT AST? BEQ 19$ ;IF EQ, NO...COMPLETE SUCCESSFUL ATTACH MOV I.PRM+4(R3),-(SP) ;GET CONTROL-C AST ADDRESS BEQ 15$ ;IF EQ, NONE...CHECK OTHER AST ADDRESS BIT #TF.XCC,I.FCN(R3) ;CONFLICTING SUBFUNCTION CODE? BNE 20$ ;IF NE, YES...RETURN AN ERROR 15$: .IF NDF S$$LIB BIS I.PRM(R3),(SP) ;"OR" IN UNSOLICITED INPUT AST ADDRESS ASR (SP)+ ;WAS EITHER ADDRESS ODD? BCS 30$ ;IF CS, YES...INVALID AST ADDRESS .IFF ;S$$LIB BIS I.PRM(R3),(SP)+ ;"OR" IN UNSOLICITED INPUT AST ADDRESS .ENDC ;S$$LIB BEQ 30$ ;IF EQ, NEITHER ADDRESS SPECIFIED...ERROR MOV #24.,R1 ;SET SIZE OF ACB TO ALLOCATE ADD #U.TAST,R4 ;POINT TO ATTACH ACB POINTER IN THE UCBX CALL ALACB ;ALLOCATE AN ACB FOR THE ATTACH BCS 40$ ;IF CS, ALLOCATION FAILED...ERROR MOVB I.FCN(R3),(R0)+ ;PUT FUNCTION CODE MODIFIERS IN ACB FLAG BYTE MOV I.PRM+4(R3),(R0)+ ;SAVE CONTROL-C AST ADDRESS IN ACB MOV I.PRM(R3),(R0) ;LIKEWISE FOR UNSOLICITED INPUT AST ADDRESS .IFTF ;T$$CCA 19$: BR ADHSUC ;COMPLETE SUCCESSFUL ATTACH .IFT ;T$$CCA 20$: TST (SP)+ ;CLEAN STACK 30$: MOV #IE.SPC,R0 ;SET ILLEGAL AST ADDRESS ERROR CODE BR 50$ ;JOIN COMMON ERROR CODE 40$: MOV #IE.NOD,R0 ;ERROR - NO DYNAMIC MEMORY 50$: CLR U.ATT-U.TSTA(R5) ;CLEAR POINTER SET UP BY $GSPKT .IF DF T$$ESC BIC #S3.RES,4(R5) ;DON'T REMEMBER ESCAPE SEQUENCES ANYMORE .ENDC ;T$$ESC BR ADHFIN ;COMPLETE ATTACH REQUEST .ENDC ;T$$CCA .PAGE .SBTTL PPDET - POST-QUEUE PROCESSING FOR DETACH REQUESTS ; ;+ ; **-PPDET - POST-QUEUE PROCESSING FOR DETACH REQUESTS ; ; THIS ROUTINE IS DISPATCHED TO FROM TTINI AFTER AN IO.DET REQUEST HAS ; BEEN DEQUEUED FOR A TERMINAL. FLUSH THE TYPEAHEAD BUFFER IF NECESSARY, ; CLEAN UP TERMINAL STATUS, AND DEALLOCATE UNNECESSARY DATA STRUCTURES. ; ; INPUTS: ; R5 => U.TSTA OF TERMINAL UCB ; R4 => UCBX FOR TERMINAL (ONLY IF T$$SPL IS DEFINED) ; R3 => CURRENT I/O PACKET ; ; OUTPUTS: NONE. ; ; REGISTERS MODIFIED: R0, R1, R2, R3, R4 ;- ; PPDET:: .IF DF T$$SER BIT #UM.SER,U.MUP-U.TSTA(R5) ;DETACH WHILE IN SERIAL MODE? BNE 10$ ;Y - DON'T FLUSH TABUF, JUMP .ENDC ;T$$SER .IF DF T$$IDO TST $MCRPT ;IS THE DISPATCHER INSTALLED? BEQ 10$ ;IF EQ NO - DON'T FLUSH TABUF .ENDC ;T$$IDO MOV R3,-(SP) ;SAVE CURRENT PACKET ADDRESS .IF DF T$$OVL MOV #I1CTXL,-(SP) ;GET ADDRESS CALL MPROT ;CALL ROUTINE TO FLUSH TYPE AHEAD .IFF ;T$$OVL CALL I1CTXL ;FLUSH TYPE-AHEAD BUFFER WITH INTERRUPTS ;LOCKED OUT .ENDC ;T$$OVL MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESS 10$: BIC #S2.CTO,2(R5) ;CLEAR CTRL-O BIT BIS #S2.IRQ!S2.ORQ!S2.SRQ,2(R5) ;LOOK FOR ALL SORTS OF PACKET IN THE QUEUE ;NEXT TIME .IF DF T$$ESC BIC #S3.RES,4(R5) ;DON'T LOOK FOR ESCAPE SEQUENCES ANYMORE .ENDC ;T$$ESC .IF DF T$$SCA!T$$MHU!T$$ICS!T$$OOB BIC #S3.TME!S3.MHE!S3.ICE,4(R5) ;DISABLE THESE BIC #S5.TMM,U.TST5-U.TSTA(R5) ;AND TERMINAL MANAGEMENT .ENDC ;T$$SCA!T$$MHU!T$$ICS!T$$OOB .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB .IF NDF T$$SPL MOV U.TUX-U.TSTA(R5),R4 ;GET UCBX BEQ ADHSUC ;IF EQ, UCBX IS GONE...COMPLETE DETACH .ENDC ;T$$SPL ADD #U.TAST,R4 ;POINT TO UNSOLICITED INPUT ACB ADDRESS X = U.TAST ;SYMBOL NEEDED FOR ASSUME MACROS .IF DF T$$CCA CALL DEACB ;DEALLOCATE ATTACH ACB IF THERE IS ONE TST (R4)+ ;SKIP TO NEXT ACB POINTER X = X + 2 .ENDC ;T$$CCA .IF DF T$$SCA ASSUME U.TSCA,X X = X + 2 CALL DEACB ;DEALLOCATE SWITCH CHARACTER ACB IF ONE TST (R4)+ ;SKIP TO NEXT ACB POINTER .ENDC ;T$$SCA .IF DF T$$MHU ASSUME U.TMHA,X X = X + 2 CALL DEACB ;DEALLOCATE MODEM HANGUP ACB IF ONE TST (R4)+ ;SKIP TO NEXT ACB POINTER .ENDC ;T$$MHU .IF DF T$$ICS ASSUME U.TICA,X X = X + 2 CALL DEACB ;DEALLOCATE ICS ACB/TEP IF ONE TST (R4)+ ;SKIP TO NEXT ACB POINTER .ENDC ;T$$ICS .IF DF T$$OOB ASSUME U.TOBA,X CALL DEACB ;DEALLOCATE OOB ACB/TEP IF ONE .ENDC ;T$$OOB .ENDC ;T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB .IF DF T$$LTH ; IF LAT TERMINALS IN SYSTEM BIT #S6.LAT,U.TST6-U.TSTA(R5) ;LAT APPLICATION TERMINAL? BEQ 20$ ; IF EQ - NO, JUST COMPLETE .IF DF T$$OVL MOV #LHDET,-(SP) ;GET ADDRESS CALL MPROT ;CALL ROUTINE IN TTLH .IFF ;T$$OVL CALL LHDET ;CALL TTLH DIRECTLY ; .ENDC ;T$$OVL BCS PPHNG ; IF CS, HANG UP THE LINE.. .ENDC ;T$$LTH 20$: BR ADHSUC ;COMPLETE SUCCESSFUL DETACH .PAGE .SBTTL PPHNG - POST-QUEUE PROCESSING FOR MODEM HANGUP REQUESTS ; ;+ ; **-PPHNG - POST-QUEUE PROCESSING FOR MODEM HANGUP REQUESTS ; ; THIS ROUTINE IS DISPATCHED TO FROM TTINI AFTER AN IO.HNG REQUEST HAS ; BEEN DEQUEUED FOR A TERMINAL. INITIATE A TIMEOUT ON THE LINE WHICH ; WILL CAUSE DTR TO DROP AND THE TERMINAL TO BE LOGGED OUT. ; ; INPUTS: ; R5 => U.TSTA OF TERMINAL UCB ; R4 => UCBX FOR TERMINAL (ONLY IF T$$SPL IS DEFINED) ; R3 => CURRENT I/O PACKET ; ; OUTPUTS: NONE. ; ; REGISTERS MODIFIED: R0, R1, R2 ;- ; PPHNG:: .IF DF T$$SPL MOV U.TAPR-U.TSTA(R5),KDSAR5 ;MAP UCBX MOV #120000,R4 ;POINT TO UCBX .IFF ;T$$SPL MOV U.TUX-U.TSTA(R5),R4 ;POINT TO UCBX .ENDC ;T$$SPL .IF DF T$$MOD BIT #U2.RMT,U.CW2-U.TSTA(R5) ;REMOTE LINE? BEQ ADHSUC ;IF EQ, LINE IS LOCAL. DO NOT KILL I/O MOV R3,-(SP) ;SAVE I/O PACKET ADDRESS BISB #US.CRW,U.STS-U.TSTA(R5) ;SET WAITING FOR CARRIER MOV #CT.TIM,R2 ;SET INDEX FOR MODEM TIMEOUT ROUTINE .IF DF T$$OVL MOV #CTRD,-(SP) ;GET ADDRESS OF ROUTINE CALL MPROT ;AND MAP AND CALL CTRD .IFF ;T$$OVL CALL CTRD ;INITIATE TIMEOUT WHICH WILL CAUSE DTR TO BE ;DROPPED AND THE USER OF THE LINE LOGGED OUT .ENDC ;T$$OVL MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESS BNE 20$ ;IF NE, FINISH I/O RETURN ;ELSE RETURN (PACKET WAS TAKEN BY LAT) 10$: .ENDC ;T$$MOD MOV R3,-(SP) ;SAVE IO PACKET POINTER .IF DF T$$OVL MOV #I1CTXL,-(SP) ;GET ADDRESS OF ROUTINE CALL MPROT ;AND MAP AND CALL FLUSH TAB .IF NDF T$$SPL TST R4 ;IS THERE A UCBX? BEQ 15$ ;IF NOT, DON'T KILL INPUT OR OUTPUT .ENDC ;NDF T$$SPL MOV #IE.ABO&377,R0 ;SET COMPLETION STATUS FOR READ MOV #KILLI1,-(SP) ;GET ADDRESS OF ROUTINE CALL MPROT ;AND MAP AND CALL KILL INPUT MOV #IE.DNR&377,R0 ;SET COMPLETION STATUS FOR WRITE MOV #KILLO1,-(SP) ;GET ADDRESS OF ROUTINE CALL MPROT ;AND MAP AND CALL KILL OUTPUT .IFF ;T$$OVL CALL I1CTXL ;FLUSH TAB .IF NDF T$$SPL TST R4 ;IS THERE A UCBX? BEQ 15$ ;IF NOT, DON'T KILL INPUT OR OUTPUT .ENDC ;NDF T$$SPL MOV #IE.ABO&377,R0 ;SET COMPLETION STATUS FOR READ CALL KILLI1 ;KILL INPUT MOV #IE.DNR&377,R0 ;SET COMPLETION STATUS FOR WRITE CALL KILLO1 ;KILL OUTPUT .ENDC ;T$$OVL 15$: MOV (SP)+,R3 ;RESTORE IO PACKET POINTER 20$: .IF DF T$$MHU BIT #S3.MHE,4(R5) ;IS CHARACTERISTIC ENABLED? BEQ ADHSUC ;BR IF NO .IF DF T$$SPL MOV #120000,R4 ;POINT TO UCBX. IT IS POSSIBLE THAT ;A CALL FROM FPORD TO THE EXEC CAUSES ;US TO LOSE THE VALUE THAT WAS IN R4 .IFF ;T$$SPL MOV U.TUX-U.TSTA(R5),R4 ;POINT TO UCBX .ENDC ;T$$SPL MOV U.TMHA(R4),R1 ;GET ACB ADDRESS .IF DF T$$OVL MOV #QUEAEN,-(SP) CALL MPROT ;QUE AST TO TASK .IFF ;T$$OVL CALL QUEAEN ;QUEUE AST TO ATTACHED TASK .ENDC ;T$$OVL .ENDC ;T$$MHU ; ; HERE TO COMPLETE AN IO.ATT, IO.DET, IO.ORG OR IO.HNG I/O WITH A SUCCESS ; (ADHSUC) OR A PRESET (ADHFIN) COMPLETION STATUS. ; ADHSUC: MOV #IS.SUC,R0 ;SET SUCCESS STATUS ADHFIN: .IF DF T$$OVL CLR R1 ;CLEAR SECOND WORD OF IOSB CALLR $IOFIN ;FINISH IO AND RETURN .IFF ;T$$OVL JMP IOFIN ;FINISH OFF THE I/O PACKET .ENDC ;T$$OVL .PAGE .IF DF T$$LTH .SBTTL PPORG - POST-QUEUE PROCESSING FOR ORIGINATE REQUESTS ; ;+ ; **-PPORG - POST-QUEUE PROCESSING TO ORIGINATE A CONNECTION TO A ; TERMINAL SERVER (ORIGINATE) ; ; THIS ROUTINE IS DISPATCHED TO FROM TTINI AFTER AN IO.ORG REQUEST HAS ; BEEN DEQUEUED FOR A TERMINAL. CHECK THAT THIS HAS BEEN ESTABLISHED ; AS A LAT APPLICATION TERMINAL AND IF SO, CALL THE LAT PROCESS. ; ; INPUTS: ; R5 => U.TSTA OF TERMINAL UCB ; R4 => UCBX FOR TERMINAL (ONLY IF T$$SPL IS DEFINED) ; R3 => CURRENT I/O PACKET ; ; OUTPUTS: NONE. ; ; REGISTERS MODIFIED: R0 ;- ; PPORG:: .IF DF T$$SPL MOV U.TAPR-U.TSTA(R5),KDSAR5 ;MAP UCBX MOV #120000,R4 ;POINT TO UCBX .IFF ;T$$SPL MOV U.TUX-U.TSTA(R5),R4 ;POINT TO UCBX .ENDC ;T$$SPL BIT #S6.LAT,U.TST6-U.TSTA(R5) ;LAT APPLICATION TERMINAL? BNE 10$ ;IF NE, YES...CAN ORIGINATE CONNECTION MOV #!,R0 ;CONNECTION REJECTED BR ADHFIN ;COMPLETE REQUEST WITH ERROR STATUS 10$: MOV R3,-(SP) ;SAVE I/O PACKET POINTER MOV R3,R0 ;GET IRP ADDRESS TO R0 FOR LAT PROCESS MOV #PO$ORG,R3 ;GET ORIGINATE CODE FOR LAT PROCESS .IF DF T$$OVL MOV #LTPRC,-(SP) ;GET ADDRESS OF ROUTINE CALL MPROT ;AND MAP AND CALL LTPRC .IFF ;T$$OVL CALL LTPRC ;CALL LAT PROCESS .ENDC ;T$$OVL MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESS TST R0 ;ERROR BACK FROM PROCESS? BNE ADHFIN ;IF NE, NO - ERROR, COMPLETE REQUEST RETURN ;ELSE RETURN, LAT WILL COMPLETE REQUEST ;WHEN CONNECTION COMPLETES .ENDC ;T$$LTH .PAGE .SBTTL PPSPC/PPSPC1 - POST-QUEUE PROCESSING FOR SPECIAL REQUESTS ; ;+ ; **-PPSPC - POST-QUEUE PROCESSING FOR SF.SMC REQUESTS ; **-PPSPC1 - POST-QUEUE PROCESSING FOR IO.GTS AND SF.GMC REQUESTS ; ; THESE ROUTINES ARE DISPATCHED TO FROM TTINI TO PROCESS IO.GTS, SF.GMC, AND ; SF.SMC REQUESTS. PPSPC IS USED WHEN AN SF.SMC REQUEST IS DEQUEUED. PPSPC1 ; IS USED WHEN AN IO.GTS OR SF.GMC REQUESTS ARE INITIATED, SINCE THEY CAN ; COMPLETE ASYNCHRONOUSLY. ; ; INPUTS: ; R5 => U.TSTA OF THE TERMINAL UCB ; R3 => CURRENT I/O PACKET ; ; OUTPUTS: NONE. ; ; REGISTERS MODIFIED: R0, R1, R2, R3, R4 ; R1 IS PRIMARILY USED AS A POINTER INTO THE USER'S CHARACTERISTIC BUFFER. ;- ; ;KEEP THIS IN APR 5 .IF NDF T$$OVL .PSECT MAP5 .ENDC ;T$$OVL .IF DF T$$SMC PPSPC:: .IF NDF T$$SPL .IF DF T$$OVL ;IF OVERLAID TTDRV MOV (SP),-(SP) ;FORCE A REMAP FIRST BEFORE CKTAB MOV 4(SP),2(SP) ;BRING UP THE APR BIAS ON STACK MOV #CKTAB,4(SP) ;THIS REQUEST MAY WANT TO CREATE OR ;REMOVE A TYPE-AHEAD BUFFER - ;CHECK ON THE WAY OUT .IFF ;DF T$$OVL ;IF NOT OVERLAID TTDRV MOV #CKTAB,-(SP) ;THIS REQUEST MAY WANT TO CREATE OR ;REMOVE A TYPE-AHEAD BUFFER - ;CHECK ON THE WAY OUT .ENDC ;DF T$$OVL .ENDC ;NDF T$$SPL MOV #IRESEL,-(SP) ;RESET S1 BITS ON THE WAY OUT .ENDC ;T$$SMC .IF DF T$$GTS!T$$GMC!T$$SMC PPSPC1::MOV I.PRM(R3),KISAR6 ;MAP USER BUFFER IN APR 6 MOV I.PRM+2(R3),R1 ;GET START OF BUFFER (WE KNOW IT IS ON A ;WORD BOUNDARY) .ENDC ;T$$GTS!T$$GMC!T$$SMC .IF DF T$$GTS CMP I.FCN(R3),#IO.GTS ;IS IT IO.GTS? BNE CHKCHR ;IF NE, NO...CHECK GET/SET CHARACTERISTICS ; ; PROCESS REQUESTS TO GET TERMINAL DRIVER SUPPORT ; MOV #TSP1,(R1)+ ;STORE FIRST WORD OF SUPPORT PARAMETERS CMP I.PRM+4(R3),#2 ;WANTS MORE THAN 1 WORD? BEQ JCHRSC ;IF EQ, NO...GIVE ONLY WHAT USER WANTS MOV #TSP2,(R1)+ ;STORE SECOND WORD .ENDC ;T$$GTS .IF DF T$$GTS!T$$GMC!T$$SMC JCHRSC: JMP CHRSUC ;FINISH OFF REQUEST CHKCHR: ; BR NXTCHR ;CHECK CHARACTERISTICS SUPPORT .ENDC ;T$$GTS!T$$GMC!T$$SMC .PAGE .SBTTL . NXTCHR - PROCESSING LOOP FOR SF.GMC/SF.SMC REQUESTS .IF DF T$$GMC!T$$SMC ; ; LOOP HERE TO START PROCESSING NEXT CHARACTERISTIC FROM USER BUFFER ; NXTCHR: SUB #2,I.PRM+4(R3) ;ANY MORE TO DO? BMI JCHRSC ;IF MI, NO...FINISH SUCCESSFUL I/O REQUEST MOVB (R1)+,R0 ;GET NEXT CHARACTERISTIC FROM USER BUFFER BEQ ERCNIH ;IF EQ, BAD CODE...RETURN ERROR CMP R0,#MCHI ;TOO HIGH? BHI ERCNIH ;IF HI, YES...RETURN BAD CODE ERROR ASL R0 ;MULTIPLY CODE BY 2 ADD #MCTAB-2,R0 ;MAKE POINTER IN MCTAB .IF DF T$$SPL MOV $DALED,KISAR6 ;MAP CHARACTERISTIC TABLE (IN TTCOM) .IFTF ;T$$SPL CLR R2 ;INIT BITMASK BISB (R0)+,R2 ;GET BITMASK FOR THIS CODE MOVB (R0)+,R4 ;GET OFFSET IN UCB MOV -(R0),R0 ;GET FULL WORD IF SUBROUTINE ADDRESS .IFT ;T$$SPL MOV I.PRM(R3),KISAR6 ;RESTORE TASK MAPPING TST R0 ;IS CHARACTERISTIC RECOGNIZED? .ENDC ;T$$SPL BEQ ERCNIH ;IF EQ, UNRECOGNIZED CHARACTERISTIC...ERROR BPL 10$ ;IF PL, NOT A SUBROUTINE...PROCESS BITMASK CMP R0,#160000 ;NEGATIVE OFFSET (NOT A SUBROUTINE AFTER ALL)? BHIS 10$ ;IF HIS, NOT A SUBROUTINE ADDRESS...SKIP .IF DF T$$GMC&T$$SMC CMP I.FCN(R3),#SF.GMC ;DO TEST FOR SF.GMC BEFORE DISPATCH .ENDC ;T$$GMC&T$$SMC CALL (R0) ;DISPATCH TO ROUTINE TO HANDLE SPECIAL... ;...CASES OF SF.GMC AND SF.SMC BR NXTCHR ;LOOP TO GET NEXT CHARACTERISTIC 10$: ADD R5,R4 ;POINT TO UCB OFFSET + U.TSTA SUB #U.TSTA,R4 ;BACK UP POINTER TO THE UCB OFFSET .ENDC ;T$$GMC!T$$SMC .IF DF T$$GMC&T$$SMC CMP I.FCN(R3),#SF.SMC ;IS IT SF.SMC? BEQ 100$ ;IF EQ, YES...PROCESS SET CHARACTERISTICS .ENDC ;T$$GMC&T$$SMC .IF DF T$$GMC ; ; PROCESS REQUEST TO RETURN TERMINAL CHARACTERISTICS TO USER ; MOVB (R4),(R1) ;STORE CURRENT VALUE IN USER BUFFER MOVB R2,R0 ;COPY BITMASK COMB R0 ;INVERT IT BICB R0,(R1) ;CLEAR IRRELEVANT BITS 20$: ASRB R2 ;SHIFT BITMASK RIGHT BCS 30$ ;CARRY - JUMP RORB (R1) ;SHIFT VALUE IN USER BUFFER RIGHT TOO BR 20$ ;LOOP 30$: INC R1 ;SKIP OVER VALUE FIELD JUST STORED BR NXTCHR ;LOOP TO GET NEXT CHARACTERISTIC .ENDC ;T$$GMC .IF DF T$$SMC ; ; PROCESS REQUEST TO SET TERMINAL CHARACTERISTICS ; 100$: MOVB -1(R1),R0 ;GET CHARACTERISTIC CODE WE ARE PROCESSING CMPB #TC.WID,R0 ;WANT TO CHANGE BUFFER SIZE? BNE 110$ ;IF NE, NO...SKIP TO NEXT CHECK CMPB #15.,(R1) ;TRYING TO MAKE BUFFER TOO SMALL? BLO 200$ ;IF LO, NO...SKIP TO SET WIDTH BR ERCVL1 ;RETURN INVALID VALUE ERROR 110$: CMPB #TC.ISL,R0 ;WANT TO CHANGE U.UNIT? BEQ ERCFIX ;IF EQ, YES...NOT ALLOWED - FIXED CHARACTERISTIC CMPB #TC.PRI,R0 ;TRYING TO CHANGE TERMINAL PRIVILEGE? BEQ ERCPRI ;IF EQ, YES...NOT ALLOWED - PRIVILEGE VIOLATION .IF DF T$$MOD CMPB #TC.ABD,R0 ;WANT TO CHANGE AUTOBAUD CHARACTERISTIC? BEQ 120$ ;IF EQ, YES...MUST BE PRIVILEGED CMPB #TC.ASP,R0 ;WANT TO CHANGE DEFAULT ANSWER SPEED? BNE 200$ ;IF NE, NO...PROCESS THE CHARACTERISTIC 120$: MOV I.TCB(R3),R0 ;GET ISSUING TASK TCB ADDRESS BIT #T3.PRV,T.ST3(R0) ;IS THE TASK PRIVILEGED? BEQ ERCPRI ;IE EQ, NO...RETURN PRIVILEGE VIOLATION .ENDC ;T$$MOD 200$: MOV R2,-(SP) ;SAVE BITMASK TO BE CHANGED MOVB (R1),R0 ;GET NEW VALUE FROM USER BUFFER 210$: ASRB R2 ;SHIFT BITMASK RIGHT BCS 220$ ;IF CS, SHIFTED FAR ENOUGH...SKIP ROLB R0 ;SHIFT NEW VALUE LEFT BR 210$ ;LOOP FOR MORE SHIFTING 220$: ROLB R2 ;PICK UP LOST BIT FROM CARRY COMB R2 ;INVERT RIGHT-ADJUSTED MASK BITB R2,(R1)+ ;NEW VALUE IN RANGE? BNE ERCVAL ;IF NE, NO...RETURN INVALID VALUE ERROR BICB (SP)+,@R4 ;CLEAR OLD VALUE BISB R0,@R4 ;SET NEW VALUE .IF DF T$$SER CMPB -2(R1),#TC.TBM ;SERIAL CHARACTERISTIC? BNE 300$ ;IF NE, NO...SKIP TSTB R0 ;NOSERIAL NOW IN EFFECT? BNE 300$ ;IF NE, NO...SKIP BIC #UM.CMD,U.MUP-U.TSTA(R5) ;ELSE, YES...CLEAR CMD IN PROGRESS 300$: .ENDC ;T$$SER CMPB #TC.PTH,-2(R1) ;PASSTHRU? BNE 301$ ;BR IF NOT BIC #S1.PTH,(R5) ;CLEAR OLD VALUE ASSUME S1.PTH*400,S3.PTH SWAB R0 ;GET BYTE IN RIGHT PLACE BISB R0,(R5) ;SET OR CLEAR S1.PTH 301$: ;PROCESS FORMFEED AND NO-ECHO CHARACTERISITCS ; CMPB #TC.NEC,-2(R1) ;IS THIS A NO-ECHO CHARACTERISTIC? BNE 303$ ;BR IF NOT TO CHECK FORMFEED BIC #U2.NEC,U.CW2-U.TSTA(R5) ;Y - CLEAR OLD VALUE ASSUME S4.HFF*400,U2.HFF ASSUME S3.NEC*400,U2.NEC*2 ASRB R0 ;GET NEW VALUE BR 305$ ;BR TO SET NEW VALUE 303$: CMPB #TC.HFF,-2(R1) ;IS THIS A FORMFEED CHARACTERISTIC? BNE NXTCHR ;IF NE, NO...LOOP FOR NEXT CHARACTERISTIC BIC #U2.HFF,U.CW2-U.TSTA(R5) ;Y - CLEAR OLD FORMFEED VALUE 305$: BISB R0,U.CW2+1-U.TSTA(R5) ;SET NEW FORMFEED VALUE BR NXTCHR ;LOOP FOR NEXT CHARACTERISTIC .ENDC ;T$$SMC .PAGE .SBTTL . ERROR HANDLING FOR GET/SET CHARACTERISTICS ; ; ERRORS IN SF.GMC OR SF.SMC REQUESTS ; .IF DF T$$GMC!T$$SMC ERCNIH: MOV #!,R0 ;ILLEGAL CHARACTERISTIC TYPE .ENDC ;T$$GMC!T$$SMC CHRFN1: DEC R1 ;BACK UP CHARACTERISTIC BUFFER POINTER BR CHRFIN ;FINISH IT OFF .IF DF T$$SMC ERCPRI: MOV #IE.PRI&377,R0 ;ATTEMPT TO EXCEED PRIVILEGES BR CHRFN1 ;FINISH IT OFF ERCVAL: TST (SP)+ ;CLEAN UP STACK FOR THIS ENTRY POINT DEC R1 ;BACK UP CHARACTERISTIC BUFFER POINTER ERCVL1: MOV #!,R0 ;ILLEGAL CHARACTERISTIC VALUE BR CHRFIN ;FINISH IT OFF ERCFIX: MOV #!,R0 ;ATTEMPT TO CHANGE FIXED CHAR. BR CHRFN1 ;FINISH IT OFF .IF DF D$$H11!D$$Z11!D$$V11 ERCSPD: MOV #!,R0 ;INVALID SPEED FOR CONTROLLER BR CHRFN1 ;FINISH IT OFF .ENDC ;D$$H11!D$$Z11!D$$V11 .IFTF ;T$$SMC ERCNSC:: MOV #!,R0 ;NOT A SETTABLE CHARACTERISTIC BR CHRFN1 ;FINISH IT OFF .IFT ;T$$SMC .IF DF T$$SPL!T$$SCA!T$$MHU!T$$ICS!T$$OOB ERCUPN: MOV #!,R0 ;STORAGE ALLOCATION FAILURE BR CHRFN1 ;FINISH IT OFF .ENDC ;T$$SPL!T$$SCA!T$$MHU!T$$ICS!T$$OOB .IF DF T$$SCA!T$$MHU!T$$ICS!T$$OOB ERCIAA: MOV #!,R0 ;ILLEGAL AST ADDRESS BR CHRFN1 ;FINISH IT OFF .ENDC ;T$$SCA!T$$MHU!T$$ICS!T$$OOB .ENDC ;T$$SMC .IF DF T$$GTS!T$$GMC!T$$SMC CHRSUC: MOV #IS.SUC,R0 ;SET SUCCESSFUL COMPLETION CODE .ENDC ;T$$GTS!T$$GMC!T$$SMC CHRFIN: SUB I.PRM+2(R3),R1 ;GET OFFSET IN USER BUFFER MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPING JMP $IOFIN ;FINISH THE I/O REQUEST .PAGE .SBTTL . GET/SET TERMINAL CHARACTERISTICS SUPPORT .SBTTL . MC*SP - TERMINAL SPEED (RCV/XMT/ANSWER) .IF DF T$$GMC!T$$SMC ; ; GET/SET RECEIVE/TRANSMIT/ANSWER SPEED ; .IF DF D$$H11!D$$Z11!D$$V11 ;ONLY DH11, DZ11 AND DHV11 CAN SET SPEED MCRSP:: MCXSP:: .IF DF T$$MOD MCASP:: .ENDC ;T$$MOD .IF DF T$$GMC&T$$SMC BEQ 310$ ;GET SPEED - JUMP .ENDC ;T$$GMC&T$$SMC .IF DF T$$SMC ; ; SET SPEED ; MOVB (R1)+,R0 ;SET SPEED - GET USER VALUE BEQ ERCVAL ;IF EQ, INVALID CHARACTERISTIC VALUE CMP R0,#SPHI ;IN RANGE? BHI ERCVAL ;IF HI, NO...INVALID CHARACTERISTIC VALUE CALL SPDPRM ;CALL CONTROLLER DEPENDENT ROUTINE BCC 10$ ;IF CC, SUCCESSFUL SPEED SETTING MOV #ERCSPD,(SP) ;CHANGE RETURN ADDRESS TO PROCESS THE ERROR 10$: RETURN ;RETURN FOR MORE/ERROR COMPLETION .ENDC ;T$$SMC .IF DF T$$GMC ; ; GET SPEED ; 310$: MOV #100000,R0 ;INDICATE GET SPEED INC R1 ;BUMP POINTER IN USER BUFFER CALL SPDPRM ;CALL CONTROLLER DEPENDENT ROUTINE .IF DF T$$MOD BIT #1000,R0 ;GET ANSWER SPEED? BEQ 320$ ;N - JUMP MOVB U.CW3+1-U.TSTA(R5),R0 ;GET ANSWER SPEED? BR 330$ ;JOIN COMMON CODE .ENDC ;T$$MOD 320$: MOVB U.CW3-U.TSTA(R5),R0 ;GET SPEED BITS CMPB -2(R1),#TC.XSP ;TRANSMIT SPEED? BNE 330$ ;N - MUST BE RECEIVE SPEED, JUMP .IF DF R$$EIS ASH #-4,R0 ;PUT TRANSMIT SPEED BITS INTO PROPER POSITION .IFF ;R$$EIS ASR R0 ;PUT TRANSMIT SPEED BITS INTO PROPER POSITION ASR R0 ; ASR R0 ; ASR R0 ; .ENDC ;R$$EIS 330$: BIC #^C<17>,R0 ;CLEAR ALL BUT SPEED BITS .IF DF T$$SPL!T$$ONI MOV $DALED,KISAR6 ;MAP DRIVER SPEED TABLES .ENDC ;T$$SPL!T$$ONI MOV R4,-(SP) ;SAVE START OF SPEED TABLE MOV #SPHI,R2 ;GET NUMBER OF ENTRIES IN TABLE 340$: CMPB R0,(R4)+ ;MATCH? BEQ 350$ ;Y - JUMP SOB R2,340$ ;N - LOOP MOV @SP,R4 ;UNRECOGNIZED SPEED - RETURN A ZERO 350$: SUB (SP)+,R4 ;GET OFFSET IN TABLE .IF DF T$$ONI!T$$SPL MOV I.PRM(R3),KISAR6 ;RESTORE TASK MAPPING .ENDC ;T$$ONI!T$$SPL MOVB R4,-1(R1) ;STORE IN USER BUFFER RETURN ;RETURN FOR NEXT CHARACTERISTIC .ENDC ;T$$GMC .PAGE .SBTTL . MCPAR/MCEPA - PARITY OPTIONS ; ; GET/SET PARITY GENERATION AND CHECKING AND SENSE ; .ENABL LSB MCPAR:: .IF DF T$$GMC&T$$SMC BEQ 1000$ ;GET PARITY GENERATION AND CHECKING - JUMP .ENDC ;T$$GMC&T$$SMC .IF DF T$$SMC ; ; SET PARITY GENERATION AND CHECKING ; BIC #U3.PAR,U.CW3-U.TSTA(R5) ;ASSUME DISABLING PARITY TSTB (R1)+ ;CHECK ASSUMPTION BEQ 1010$ ;CORRECT - JUMP BIS #U3.PAR,U.CW3-U.TSTA(R5) ;ENABLE PARITY GENERATION AND CHECKING BR 1010$ ;JOIN COMMON CODE TO CHANGE LINE PARAMETERS .ENDC ;T$$SMC .IF DF T$$GMC ; ; GET PARITY GENERATION AND CHECKING ; 1000$: CLRB (R1) ;ASSUME PARITY IS NOT ENABLED BIT #U3.PAR,U.CW3-U.TSTA(R5) ;CHECK THAT BEQ 1030$ ;CORRECT - JUMP INCB (R1) ;SHOW THAT PARITY IS ENABLED BR 1030$ ;JOIN COMMON CODE TO CHECK LINE PARAMETERS .ENDC ;T$$GMC ; ; GET/SET PARITY SENSE ; MCEPA:: .IF DF T$$GMC&T$$SMC BEQ 1020$ ;GET PARITY SENSE - JUMP .ENDC ;T$$GMC&T$$SMC .IF DF T$$SMC ; ; SET PARITY SENSE ; BIC #U3.OPA,U.CW3-U.TSTA(R5) ;ASSUME SETTING EVEN PARITY TSTB (R1)+ ;CHECK ASSUMPTION BNE 1010$ ;CORRECT - JUMP BIS #U3.OPA,U.CW3-U.TSTA(R5) ;SET ODD PARITY 1010$: MOV #6000,R0 ;INDICATE DEVICE DEPENDENT SPEED FORMAT BISB U.CW3-U.TSTA(R5),R0 ;GET CURRENT SPEED BR 1040$ ;RESET TO CURRENT SPEED AND PARITY SETTINGS .ENDC ;T$$SMC .IF DF T$$GMC ; ; GET PARITY SENSE ; 1020$: CLRB (R1) ;ASSUME ODD PARITY ASSUME U3.OPA,100000 TST U.CW3-U.TSTA(R5) ;CHECK THAT BMI 1030$ ;CORRECT - JUMP INCB (R1) ;SHOW EVEN PARITY 1030$: INC R1 ;BUMP POINTER MOV #100000,R0 ;INDICATE GET SPEED .ENDC ;T$$GMC .IF DF T$$GMC ! T$$SMC ; 1040$: CALL CTRPRM ;MAKE SURE INTERFACE HAS SETTABLE PARITY RETURN ;RETURN TO CALLER FOR NEXT CHARACTERISTIC .ENDC ;DF T$$GMC ! T$$SMC .SBTTL . MCCLN - SETTING (7/8-BIT) CHARACTER LENGTH ; ; GET/SET CHARACTER LENGTH ; MCCLN:: .IF DF T$$GMC&T$$SMC BEQ 1050$ ;GET CHAR LENGTH - JUMP .ENDC ; T$$GMC&T$$SMC .IF DF T$$SMC ; ; SET 7-BIT CHARACTER LENGTH ; BIC #S5.CLN,U.TST5-U.TSTA(R5) ;ASSUME 8-BIT TSTB (R1)+ ;CHECK ASSUMPTION BEQ 1060$ ;CORRECT - JUMP BIS #S5.CLN,U.TST5-U.TSTA(R5) ;SET 7-BIT BR 1060$ ; JOIN COMMON CODE TO CHANGE LINE PARAMETERS .ENDC ;T$$SMC .IF DF T$$GMC ; ; GET CHARACTER LENGTH ; 1050$: CLRB (R1) ;ASSUME 8-BIT BIT #S5.CLN,U.TST5-U.TSTA(R5) ;CHECK THAT BEQ 1070$ ;CORRECT - JUMP INCB (R1) ;SET 7-BIT LENGTH BR 1070$ ;JOIN COMMON CODE TO CHECK LINE PARAMETERS .ENDC ;T$$GMC .IF DF T$$SMC 1060$: MOV #10000,R0 ;INDICATE SET 7-BIT LENGTH BR 1080$ .ENDC ; DF T$$SMC .IF DF T$$GMC 1070$: INC R1 ;BUMP POINTER MOV #20000,R0 ;INDICATE GET LENGTH .ENDC ;DF T$$GMC .IF DF T$$GMC ! T$$SMC 1080$: CALL CTRPRM ;MAKE SURE INTERFACE HAS SETTABLE LENGTH RETURN ;RETURN TO CALLER FOR NEXT CHARACTERISTICS .ENDC ;DF T$$GMC ! T$$SMC .DSABL LSB ; ; LOCAL SUBROUTINE TO CALL CONTROLLER-DEPENDENT ROUTINE ; SPDPRM: CMPB -2(R1),#TC.RSP ;RECEIVE SPEED? BEQ 10$ ;IF EQ, YES...SKIP BIS #400,R0 ;N - FLAG TRANSMIT SPEED 10$: .IF DF T$$MOD CMPB -2(R1),#TC.ASP ;ANSWER SPEED? BNE CTRPRM ;IF NE, NO...SKIP BIS #1000,R0 ;Y - FLAG ANSWER SPEED .ENDC ;T$$MOD CTRPRM: MOV R1,-(SP) ;Save R1 CLR R1 ;Indicate not flow control change. .ENDC ;D$$H11!D$$Z11!D$$V11 .ENABLE LSB CTRPR2: MOV #10$,-(SP) CALL MPCCOR ;MAP DRIVER DATA AND RETURN AS A CO-ROUTINE MOV #CT.PRM,R2 ;SET INDEX FOR LINE PARAMETER ROUTINE .IF DF T$$OVL MOV #CTRD,-(SP) ;GET ADDRESS OF ROUTINE CALL MPROT ;AND GOTO ROUTINE RETURN ;CAN'T USE CALLR CAUSE OF STACK INPUT TO MPROT .IFF ;T$$OVL CALLR CTRD ;CALL CONTROLLER ROUTINE AND PRESERVE CC-C .ENDC ;T$$OVL 10$: MOV (SP)+,R1 ;Restore R1 and preserve CC-C RETURN ;Done ; .DSABLE LSB .PAGE .SBTTL . MCTSY, MCHSY, MCBIN - FLOW CONTROL STATUS CHANGE .ENABL LSB MCTSY:: ; OUTPUT FLOW CONTROL .IF DF T$$GMC&T$$SMC BEQ 9100$ ;GET OUTPUT FLOW CONTROL INFO - JUMP .ENDC ;T$$GMC&T$$SMC .IF DF T$$SMC ; ; SET OUTPUT FLOW CONTROL ; MOV #^B<1000>,-(SP) ; ASSUME NO OUTPUT FLOW CONTROL BIC #S3.TSY,-U.TSTA(R5) ; ASSUME NO TTSYNCH TSTB (R1)+ ; CHECK ASSUMPTION BEQ 9900$ ; CORRECT - NOTIFY THE PORT BIS #S3.TSY,-U.TSTA(R5) ; SET TTSYNCH MOV #^B<0100>,(SP) ; SET FLAG FOR ENABLE FLOW CONTROL BR 9900$ ; NOTIFY THE PORT .ENDC ;T$$SMC .IF DF T$$GMC 9100$: CLRB (R1) ; ASSUME NO OUTPUT FLOW CONTROL BIT #S3.TSY,-U.TSTA(R5) ; CHECK BEQ 9950$ ; CORRECT - RETURN INCB (R1) ; SHOW OUTPUT FLOW CONTROL BR 9950$ ; AND RETURN .ENDC ;T$$GMC MCHSY:: ; Input flow control .IF DF T$$GMC&T$$SMC BEQ 9200$ ;Get input flow control info - Jump .ENDC ;T$$GMC&T$$SMC .IF DF T$$SMC ; ; Set input flow control ; MOV #^B<0010>,-(SP) ; ASSUME NO INPUT FLOW CONTROL BIC #S4.HSY,-U.TSTA(R5) ; Assume no HSYNCH TSTB (R1)+ ; Check assumption BEQ 9900$ ; Correct - Notify the port BIS #S4.HSY,-U.TSTA(R5) ; Set HSYNCH MOV #^B<0001>,(SP) ; SET FLAG FOR ENABLE FLOW CONTROL BR 9900$ ; Notify the port .ENDC ;T$$SMC .IF DF T$$GMC 9200$: CLRB (R1) ; Assume no input flow control BIT #S4.HSY,-U.TSTA(R5) ; Check BEQ 9950$ ; Correct - Return INCB (R1) ; Show output flow control BR 9950$ ; And return .ENDC ;T$$GMC MCBIN:: ; Read Pass All .IF DF T$$GMC&T$$SMC BEQ 9300$ ;Get read pass all info - Jump .ENDC ;T$$GMC&T$$SMC .IF DF T$$SMC ; ; Set read pass all ; MOV #^B<1000>,-(SP) ; ASSUME NO OUTPUT FLOW CONTROL BIS #S3.RAL,-U.TSTA(R5) ; Assume read pass all TSTB (R1)+ ; Check assumption BNE 9900$ ; Correct - Notify the port BIC #S3.RAL,-U.TSTA(R5) ; Set no read pass all BIT #S3.TSY,-U.TSTA(R5) ; TTSYNCH now? BEQ 9900$ ; If EQ no - Notify port of no flow control MOV #^B<0100>,(SP) ; Set the output flow control flags BR 9900$ ; Notify the port .ENDC ;T$$SMC .IF DF T$$GMC 9300$: CLRB (R1) ; Assume not read pass all BIT #S3.RAL,-U.TSTA(R5) ; Check BEQ 9950$ ; Correct - Return INCB (R1) ; Show read pass all BR 9950$ ; And return .ENDC ;T$$GMC .IF DF T$$SMC ; ; Notify the port of the flow control status change. The flags ; are passed in R1. ; 9900$: MOV (SP),-(SP) ; Duplicate the top of stack MOV R1,2(SP) ; Save R1 MOV (SP)+,R1 ; Settup the flag CALLR CTRPR2 ; Call the port and exit .ENDC ;T$$SMC .IF DF T$$GMC 9950$: INC R1 ; POINT TO NEXT CHARACTERISTIC RETURN ; All done with this one .ENDC ;T$$GMC .DSABL LSB .PAGE .SBTTL . MCTTP - TERMINAL TYPE OPTIONS ; ; GET/SET TERMINAL TYPE ; MCTTP:: .IF DF T$$GMC&T$$SMC BEQ 460$ ;GET TERMINAL TYPE - JUMP .ENDC ;T$$GMC&T$$SMC .IF DF T$$SMC ; ; SET TERMINAL TYPE. ; IF THE TYPE IS RECOGNIZED (CONTAINED IN THE TABLES TTYP1, TTYP2, TTYP3), ; SET THE CORRESPONDING IMPLICIT CHARACTERISTICS. IMPLICIT CHARACTERISTICS ; ARE: ; TC.HHT ; TC.HFF ; TC.HFL ; TC.LPP ; TC.SCP ; TC.VFL ; TC.WID ; ; IN ADDITION, THE CURSOR POSITIONING TYPE IS STORED. ; ; IN ANY CASE, STORE NEW TYPE VALUE IN U.TTYP. ; CLR R2 ;GET NEW TYPE VALUE BISB @R1,R2 ;WITHOUT SIGN EXTEND PROBLEMS BEQ 440$ ;ZERO - UNKNOWN, JUMP CMPB R2,#TTPHI ;IN TERMINAL TYPE TABLE? BHI 440$ ;N - UNKNOWN, JUMP MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPING TSTB TTYP2-1(R2) ;UNSUPPORTED TERMINAL TYPE? BEQ 435$ ;Y - JUMP BIC #U2.CRT,U.CW2-U.TSTA(R5) ;ASSUME 0 FOR ALL CHARACTERISTICS BIC #S4.HFF!S4.HHT!S4.HFL!S4.VFL,6(R5) ;MORE BITS TO CLEAR BIC #U3.UPC,U.CW3-U.TSTA(R5) ;ASSUME TERMINAL SUPPORTS LOWERCASE CMPB R2,#T.AS35 ;CHECK THAT BHI 400$ ;ASSUMPTION WAS CORRECT - JUMP BIS #U3.UPC,U.CW3-U.TSTA(R5) ;FORCE CONVERSION TO UPPERCASE 400$: MOVB TTYP1-1(R2),R0 ;GET IMPLICIT CHARACTERISTICS BICB #300,R0 ;CLEAR OUT CURSOR POS. TYPE ; ; HFF,HFL,HHT,VFL MUST BE IN THE LOW BYTE OF STATUS WORD 4 ; .IIF GE S4.HFF-400 .ERROR .IIF GE S4.HFL-400 .ERROR .IIF GE S4.HHT-400 .ERROR .IIF GE S4.VFL-400 .ERROR BISB R0,6(R5) ;STORE IMPLICIT CHARACTERISTICS IN LOW ;BYTE OF STATUS WORD 4 BIC #U2.HFF,U.CW2-U.TSTA(R5) ;ASSUME NEW TYPE DOESN'T SUPPORT FF BITB #S4.HFF,R0 ;WAS FORMFEED CHARACTERISTIC SET? BEQ 420$ ;N - JUMP BIS #U2.HFF,U.CW2-U.TSTA(R5) ;INDICATE TERMINAL SUPPORTS FF 420$: MOVB TTYP2-1(R2),U.CW4-U.TSTA(R5) ;STORE IMPLICIT PAGE WIDTH MOVB TTYP3-1(R2),U.TLPP-U.TSTA(R5) ;STORE IMPLICIT PAGE LENGTH BPL 430$ ;NOT A SCOPE - JUMP BICB #200,U.TLPP-U.TSTA(R5) ;CLEAR SCOPE FLAG IN U.TLPP BIS #U2.CRT,U.CW2-U.TSTA(R5) ;INDICATE TERMINAL IS A SCOPE 430$: .IIF LT S4.ABD-400 .ERROR ; ABD MUST BE IN THE HIGH BYTE BICB #^C,7(R5) ;SET EXTENDED TERMINAL CHARACTERISTICS BISB TTYP4-1(R2),7(R5) ; ... 435$: ;REFERENCE LABEL MOV I.PRM(R3),KISAR6 ;RESTORE TASK MAPPING 440$: MOVB (R1),U.TTYP-U.TSTA(R5) ;SET TERMINAL TYPE BIC #U2.L3S!U2.VT5,U.CW2-U.TSTA(R5) ;CLEAR TERMINAL TYPE BITS CMPB (R1)+,#T.L30S ;LA30S? BNE 450$ ;N - JUMP BIS #U2.L3S,U.CW2-U.TSTA(R5) ;OTHERWISE, SET LA30S TYPE FLAG BR 455$ ;SKIP TO FINISH 450$: CMPB -1(R1),#T.VT05 ;VT05B? BNE 455$ ;IF NE, NO...SKIP BIS #U2.VT5,U.CW2-U.TSTA(R5) ;OTHERWISE, SET VT05B TYPE FLAG 455$: RETURN ;RETURN FOR NEXT CHARACTERISTIC .ENDC ;T$$SMC .IF DF T$$GMC ; ; GET TERMINAL TYPE ; 460$: MOVB U.TTYP-U.TSTA(R5),(R1)+ ;GIVE USER THE TERMINAL TYPE RETURN ;RETURN FOR NEXT CHARACTERISTIC .ENDC ;T$$GMC .PAGE .SBTTL . MCTBF - TYPEAHEAD BUFFER COUNT OPTIONS ; ; FLUSH TYPEAHEAD OR GET TYPEAHEAD BUFFER ACTIVE CHARACTER COUNT ; MCTBF:: .IF DF T$$GMC&T$$SMC BEQ 510$ ;GET COUNT - JUMP .ENDC ;T$$GMC&T$$SMC .IF DF T$$SMC ; ; FLUSH THE TYPE-AHEAD BUFFER ; INC R1 ;SKIP PAST DUMMY SET VALUE CALL MPCCOR ;MAP DATABASE AND COME BACK AS CO-ROUTINE .IF DF T$$OVL MOV #I1CTXL,-(SP) ;GET ADDRESS CALL MPROT ;CALL ROUTINE TO FLUSH TYPE AHEAD RETURN ;BACK FROM COROUTINE .IFF ;T$$OVL CALLR I1CTXL ;FLUSH TYPE-AHEAD BUFFER WITH INTERRUPTS ;LOCKED OUT .ENDC ;T$$OVL .ENDC ;T$$SMC .IF DF T$$GMC ; ; GET THE NUMBER OF CHARACTERS IN THE TYPE-AHEAD BUFFER ; 510$: .IF DF T$$SPL MOV U.TAPR-U.TSTA(R5),KDSAR5 ;MAP THE UCBX AND TABUF MOV #120000+U.TTBF,R2 ;GET TABUF .IFF ;T$$SPL MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPING MOV U.TTAB-U.TSTA(R5),R2 ;GET TABUF .IFTF ;T$$SPL MOVB 2(R2),R2 ;GET ACTIVE CHARACTER COUNT .IFF ;T$$SPL MOV I.PRM(R3),KISAR6 ;MAP USER BUFFER .ENDC ;T$$SPL MOVB R2,(R1)+ ;STORE COUNT IN BUFFER RETURN ;RETURN FOR NEXT CHARACTERISTIC .ENDC ;T$$GMC .PAGE .SBTTL . MCTYP/MCTBS - TYPEAHEAD BUFFER SIZE OPTIONS ; ; GET/SET TYPEAHEAD BUFFER PRESENCE AND SIZE ; .IF DF T$$SPL .ENABL LSB MCTYP:: .IF DF T$$GMC&T$$SMC BEQ 520$ ;GET PRESENCE - JUMP .ENDC ;T$$GMC&T$$SMC .IF DF T$$SMC ; ; ENABLE TYPEAHEAD WITH AN OPTIMAL DEFAULT SIZE ; MOV #<<2*64.>->,R2 ;COMPUTE OPTIMAL TABUF SIZE TSTB (R1)+ ;ASSUME ENABLING TYPEAHEAD BNE 530$ ;CORRECT - JUMP CLR R2 ;INDICATE NO TYPEAHEAD BR 530$ ;ENFORCE THAT .ENDC ;T$$SMC .IF DF T$$GMC ; ; RETURN WHETHER TYPEAHEAD IS ENABLED OR DISABLED (ENABLED IMPLIES A SIZE ; OF 2 OR GREATER) ; 520$: MOVB #1,(R1)+ ;ASSUME TYPEAHEAD IS ENABLED BR 580$ ;CHECK THAT .ENDC ;T$$GMC ; ; GET/SET TYPEAHEAD BUFFER SIZE ; MCTBS:: .IF DF T$$GMC&T$$SMC BEQ 570$ ;GET COUNT - JUMP .ENDC ;T$$GMC&T$$SMC .IF DF T$$SMC ; ; SET THE SIZE OF THE TYPEAHEAD BUFFER (0 -> 255.). ; A SIZE OF ZERO OR ONE IMPLIES TYPEAHEAD DISABLED ; CLR R2 ;PREPARE TO PICK UP A BYTE BISB (R1)+,R2 ;GET THE USER SPECIFIED SIZE 530$: MOV R1,-(SP) ;SAVE BUFFER POINTER MOV #120000+U.TAST,R1 ;SET POINTER TO UNSOLICITED INPUT ACB X = U.TAST .IF DF T$$CCA MOV (R1)+,-(SP) ;SAVE UNSOLICITED INPUT ACB ADDRESS X = X + 2 .ENDC ;T$$CCA .IF DF T$$SCA ASSUME U.TSCA,X X = X + 2 MOV (R1)+,-(SP) ;SAVE SWITCH CHARACTER ACB ADDRESS .ENDC ;T$$SCA .IF DF T$$MHU ASSUME U.TMHA,X X = X + 2 MOV (R1)+,-(SP) ;SAVE MODEM HANGUP ACB ADDRESS .ENDC ;T$$MHU .IF DF T$$ICS ASSUME U.TICA,X X = X + 2 MOV (R1)+,-(SP) ;SAVE ICS ACB/TEP ADDRESS .ENDC ;T$$ICS .IF DF T$$OOB ASSUME U.TOBA,X X = X + 2 MOV (R1)+,-(SP) ;SAVE OOB ACB/TEP ADDRESS .ENDC ;T$$OOB MOV R2,R1 ;PUT SIZE IN R1 BNE 540$ ;SETTING NOTYPEAHEAD? MOV #1,R1 ;Y - SET SIZE TO 1 540$: MOV R1,-(SP) ;SAVE SIZE ADD #T$$UXL+4+77,R1 ;COMPUTE TOTAL NUMBER OF BYTES NEEDED ASH #-6,R1 ;CONVERT TO NUMBER OF SECONDARY POOL BLOCKS CALL $ALSEC ;ATTEMPT TO ALLOCATE THEM BCS 560$ ;FAILURE - JUMP MOV R0,-(SP) ;SAVE ADDRESS OF SEC POOL RETURNED BY $ALSEC MTPS #TTPRI ;PREVENT INTERRUPTS WHILE CHANGING SIZE .IF DF T$$OVL MOV $DALED,KISAR6 ;;MAP TO DATA FOR MPROT MOV #DEUCBX,-(SP) ;;DEALLOCATE THE CURRENT UCBX AND TABUF CALL MPROT ;; ... .IFF ;T$$OVL CALL DEUCBX ;;DEALLOCATE CURRENT UCBX AND TABUF .IFTF ;T$$OVL MOV (SP)+,R0 ;;RETRIEVE THE NEW ADDRESS MOVB (SP),U.TBSZ-U.TSTA(R5) ;;SET THE NEW SIZE BIS #S3.TAB,4(R5) ;;ASSUME SETTING TYPEAHEAD DEC (SP)+ ;;CHECK THAT BNE 550$ ;;CORRECT - JUMP BIC #S3.TAB,4(R5) ;;SET NOTYPEAHEAD 550$: .IFT ;T$$OVL MOV #STUCBX,-(SP) ;;CREATE THE NEW UCBX AND TABUF CALL MPROT ;; ... MOV I.PRM(R3),KISAR6 ;; REMAP TASK .IFF ;T$$OVL CALL STUCBX ;;CREATE THE NEW UCBX AND TABUF .ENDC ;T$$OVL MOV #120000+X,R1 ;;POINT TO FIRST UCBX CELL TO BE MOVED .IIF DF T$$OOB, MOV (SP)+,-(R1) ;;RESTORE OOB ACB/TEP POINTER .IIF DF T$$ICS, MOV (SP)+,-(R1) ;;RESTORE ICS ACB/TEP POINTER .IIF DF T$$MHU, MOV (SP)+,-(R1) ;;RESTORE MODEM HANGUP ACB POINTER .IIF DF T$$SCA, MOV (SP)+,-(R1) ;;RESTORE SWITCH CHAR. ACB POINTER .IIF DF T$$CCA, MOV (SP)+,-(R1) ;;RESTORE UNSOL. INPUT ACB POINTER MTPS #PR0 ;;ENABLE INTERRUPTS MOV (SP)+,R1 ;RESTORE TASK BUFFER POINTER RETURN ;GET NEXT CHARACTERISTIC ; ; ALLOCATION FAILURE TRYING TO CREATE A NEW TYPEAHEAD BUFFER ; 560$: STKPOP = X - U.TAST + 2 ADD #STKPOP,SP ;CLEAR PARAMETERS FROM STACK MOV (SP)+,R1 ;RESTORE TASK BUFFER POINTER TST (SP)+ ;CLEAN RETURN ADDRESS FROM STACK JMP ERCUPN ;REPORT ALLOCATION FAILURE .ENDC ;T$$SMC .IF DF T$$GMC ; ; GET THE SIZE OF THE TYPEAHEAD BUFFER ; 570$: MOVB U.TBSZ-U.TSTA(R5),(R1)+ ;GET SIZE ASSUMING TYPEAHEAD ENABLED 580$: BIT #S3.TAB,4(R5) ;IS TYPEAHEAD ENABLED? BNE 590$ ;CORRECT - JUMP CLRB -1(R1) ;RETURN SIZE = 0 590$: RETURN ;GET NEXT CHARACTERISTIC .ENDC ;T$$GMC .DSABL LSB .ENDC ;T$$SPL .PAGE .SBTTL . MCCTS - CONTROL-S STATE ; ; GET/SET CONTROL-S STATUS ; MCCTS:: .IF DF T$$GMC&T$$SMC BEQ 630$ ;GET ^S STATUS - JUMP .ENDC ;T$$GMC&T$$SMC .IF DF T$$SMC ; ; SET OR CLEAR ^S CONDITION ; MOVB (R1)+,R2 ;GET NEW VALUE FROM USER BUFFER CALL MPCCOR ;MAP DRIVER DATA AND COME BACK AS A CO-ROUTINE TSTB R2 ;ARE WE SETTING ^S? BNE 610$ ;Y - JUMP ; ; NOTE: DUE TO MAPPING COMPLICATIONS, THE FOLLOWING CODE IS DUPLICATED ; FROM I1CTSL AND I1CTQL ;N - FAKE A ^Q. TASK MAPPED ON RETURN CALL LOCKI ;LOCK OUT INTERRUPTS BIC #S2.CTS,2(R5) ;;;CLEAR CONTROL-S FLAG MOV #CT.RES,R2 ;;;SET INDEX FOR "RESUME OUTPUT" BITB #US.OIU,U.STS-U.TSTA(R5) ;;;EXPECTING AN OUTPUT INTERRUPT? BNE 660$ ;;;IF NE, NO...JUST EXIT BR 620$ 610$: ;FAKE A ^S, RETURN WILL REMAP TASK CALL LOCKI ;LOCK OUT INTERRUPTS BIS #S2.CTS,2(R5) ;;;SET CONTROL-S FLAG MOV #CT.STP,R2 ;;;SET INDEX FOR "STOP OUTPUT" 620$: .IF DF T$$OVL MOV #CTRD,-(SP) ;GET ADDRESS OF ROUTINE CALL MPROT ;AND GOTO ROUTINE RETURN .IFF ;T$$OVL CALLR CTRD ;;;CALL CONTROLLER DEPENDENT ROUTINE .ENDC ;T$$OVL .ENDC ;T$$SMC .IF DF T$$GMC ; ; GET TERMINAL ^S AND ^O STATUS ; 630$: CLRB @R1 ;ASSUME NEITHER ^S OR ^O IS SET ASSUME S2.CTS,100000 TST 2(R5) ;VERIFY ASSUMPTION FOR ^S BIT BPL 640$ ;ASSUMED CORRECTLY - JUMP INCB @R1 ;ASSUMPTION WAS WRONG - SET THE BIT 640$: BIT #S2.CTO,2(R5) ;VERIFY ASSUMPTION FOR ^O BIT BEQ 650$ ;^O IS NOT SET - JUMP BISB #2,@R1 ;^O IS SET, SET CORRESPONDING USER BIT 650$: INC R1 ;SKIP PAST VALUE FIELD .ENDC ;T$$GMC .IF DF T$$GMC!T$$SMC 660$: RETURN ;GET NEXT CHARACTERISTIC .ENDC ;T$$GMC!T$$SMC .PAGE .SBTTL . MCACD - ANCILLARY CONTROL DRIVER .IF DF T$$ACD ; ; GET/SET ANCILLARY CONTROL DRIVER (ACD) ; MCACD:: .IF DF T$$GMC&T$$SMC BEQ 810$ ;GET ACD IDENTIFICATION NUMBER .ENDC ;T$$GMC&T$$SMC .IF DF T$$SMC ; ; SET/RESET THE ACD ASSOCIATED WITH THIS TERMINAL ; MOV R1,-(SP) ;SAVE CHARACTERISTICS BUFFER POINTER MOV R3,-(SP) ;SAVE I/O PACKET POINTER CLR -(SP) ;ASSUME NO TARGET ACD WAS SPECIFIED TSTB @R1 ;CHECK THAT ASSUMPTION BEQ 730$ ;VALID - JUMP ; ; SEARCH THE ACB LIST (LISTHEAD IS $ACDHD) FOR THE PROTOTYPE ACB WHICH ; HAS THE SAME IDENTIFICATION NUMBER AS THE NUMBER SPECIFIED BY THE REQUEST ; MOV $ACDHD,R0 ;TARGET ACD SPECIFIED, FIND ITS PROTOTYPE ACB BEQ 710$ ;THERE ARE NO ACDS IN THE SYSTEM - RETURN ERROR 700$: CMPB A.NUM(R0),@R1 ;HAVE WE FOUND THE MATCHING PROTOTYPE ACD BLOCK? BEQ 720$ ;Y - JUMP MOV A.LIN(R0),R0 ;N - GET NEXT ACB IN LIST BNE 700$ ;KEEP LOOKING 710$: TST (SP)+ ;CLEAN STACK MOV (SP)+,R3 ;RESTORE I/O PACKET POINTER MOV (SP)+,R1 ;RESTORE CHARACTERISTICS BUFFER POINTER TST (SP)+ ;CLEAN RETURN ADDRESS FROM STACK JMP ERCVL1 ;RETURN BAD VALUE ERROR ; ; FOUND THE ACB. CHECK IF CONNECTS ARE DISALLOWED ; 720$: BITB #AS.DLT!AS.DIS,A.STA(R0) ;ACD MARKED FOR DELETE OR DISABLED? BNE 710$ ;Y - ERROR ; ; ATTEMPT TO ALLOCATE A FULL ACB ; MOV R0,-(SP) ;SAVE R0 DESTROYED BY ALLOCATION ROUTINE CLR R1 ;EXTRA STEP TO AVOID SIGN EXTEND BISB A.FLEN(R0),R1 ;SET LENGTH OF FULL ACB CALL $ALOCB ;ALLOCATE AN ACB MOV R0,R2 ;COPY ACB ADDRESS WITHOUT AFFECTING CARRY BIT MOV (SP)+,R0 ;RESTORE R0 WITHOUT AFFECTING CARRY BIT BCS 710$ ;ALLOCATION FAILED - ERROR ; ; SAVE THE ADDRESS OF THE FULL ACB, AND COPY THE COMMON FIELDS FROM THE ; PROTOTYPE ACB INTO IT ; MOV R2,@SP ;REPLACE ZERO WITH FULL ACB ADDRESS INC A.ACC(R0) ;UPDATE ACD USE COUNT MOV (R0)+,(R2)+ ;COPY RELOCATION BIAS (A.REL) MOV (R0)+,(R2)+ ;COPY DISPATCH TABLE POINTER (A.DIS) MOV (R0)+,(R2)+ ;COPY FIRST FUNCTION MASK WORD (A.MAS) MOV (R0)+,(R2)+ ;COPY SECOND FUNCTION MASK WORD (A.MAS+2) MOV (R0),(R2) ;COPY ID NUMBER (A.NUM) AND LENGTH (A.FLEN) ; ; IF THE TERMINAL IS CURRENTLY LINKED TO AN ACD, FIND THE PROTOTYPE ACB. ; IF IT CANNOT BE FOUND THEN A SERIOUS ERROR HAS OCCURRED AND THE SYSTEM ; IS CRASHED. ; 730$: MOV U.ACB-U.TSTA(R5),R2 ;GET CURRENT ACB BEQ 770$ ;NONE - JUMP MOV $ACDHD,R0 ;SEARCH THE ACB LIST FOR ITS PROTOTYPE BEQ 750$ ;LIST IS EMPTY YET TERMINAL HAS AN ACD - CRASH 740$: CMPB A.NUM(R0),A.NUM(R2) ;IS THIS THE RIGHT PROTOTYPE? BEQ 760$ ;Y - JUMP MOV A.LIN(R0),R0 ;GET NEXT PROTOTYPE ACB IN LIST BNE 740$ ;KEEP LOOKING 750$: CRASH ;CAN'T FIND PROTOTYPE OF CURRENT ACD - CRASH ; ; FOUND THE PROTOTYPE. DECREMENT THE USE COUNT AND DISCONNECT THE ACD FROM ; THE TERMINAL. THEN ALERT THE ACD TO WHAT HAS TAKEN PLACE. ; 760$: DECB A.ACC(R0) ;DECREMENT THE USE COUNT CLR U.ACB-U.TSTA(R5) ;DISASSOCIATE THE ACD FROM THE TERMINAL MOV #A.DISC,R1 ;SET TO CALL ACD AT DISCONNECT ENTRY POINT MOV R2,R0 ;MAKE ACB ADDRESS AVAILABLE TO ACD CALL 790$ ;SWITCH TO ACD ; ; COMPLETE DISCONNECT PROCESSING BY DEALLOCATING THE OLD FULL ACB ; MOV R2,R0 ;COPY ADDRESS OF NOW UNUSED ACB CLR R1 ;EXTRA STEP TO AVOID SIGN EXTEND BISB A.FLEN(R0),R1 ;SET LENGTH OF FULL ACB CALL $DEACB ;DEALLOCATE THE ACB ; ; CONNECT THE NEW ACD IF ONE WAS SPECIFIED ; 770$: MOV @SP,R0 ;GET THE NEW ACD FULL ACB ADDRESS BEQ 780$ ;NONE SPECIFIED - EXIT ; ; INFORM THE ACD OF THE CONNECT AND THEN PERFORM THE CONNECT ITSELF ; CLRB A.IOS(R0) ;ASSUME CONNECT REQUEST WILL BE ACCEPTED MOV #A.CONN,R1 ;SET TO CALL ACD AT ITS CONNECT ENTRY POINT CALL 790$ ;SWITCH TO THE ACD MOV (SP),R0 ;GET THE ACB ADDRESS TSTB A.IOS(R0) ;WAS CONNECT REQUEST ACCEPTED? BEQ 775$ ;Y - JUMP CLR R1 ;EXTRA STEP TO AVOID SIGN EXTEND BISB A.FLEN(R0),R1 ;SET LENGTH OF FULL ACB THE ACD HAS REJECTED CALL $DEACB ;DEALLOCATE THE ACB BR 710$ ;RETURN AN ERROR 775$: MOV R0,U.ACB-U.TSTA(R5) ;LINK THE ACB TO CONNECT ACD TO THE TERMINAL ; ; SET/RESET EXIT PROCESSING ; 780$: TST (SP)+ ;CLEAN STACK MOV (SP)+,R3 ;RESTORE I/O PACKET POINTER MOV (SP)+,R1 ;RESTORE CHARACTERISTICS BUFFER POINTER TSTB (R1)+ ;POINT TO THE NEXT PARAMETER RETURN ;RETURN FOR NEXT CHARACTERISTIC ; ; SUBROUTINE TO SET UP STACK PARAMETERS AND THEN CALL THE EXECUTIVE SUBROUTINE ; WHICH SWITCHES FROM THE DRIVER TO THE ACD AND BACK AGAIN ; 790$: MOV KINAR5,-(SP) ;SET CURRENT MAPPING .IF DF T$$COM MOV KDSAR5,-(SP) ;SET CURRENT D-SPACE MAPPING .ENDC MOV R1,-(SP) ;SET ENTRY POINT OFFSET JMP $SWAC1 ;JUMP TO ROUTINE TO AVOID EXTRA STACK STORAGE .ENDC ;T$$SMC .IF DF T$$GMC ; ; RETURN THE IDENTICATION NUMBER OF THE CURRENT ACD, IF ANY ; 810$: CLRB (R1)+ ;ASSUME THERE IS NO ACD FOR THIS TERMINAL MOV U.ACB-U.TSTA(R5),R0 ;GET THE ACD BLOCK BEQ 820$ ;NONE - JUMP MOVB A.NUM(R0),-1(R1) ;RETURN ITS IDENTIFICATION NUMBER 820$: RETURN ;RETURN FOR NEXT CHARACTERISTIC .ENDC ;T$$GMC .ENDC ;T$$ACD .PAGE .SBTTL . MCRMT - LOCAL/REMOTE/DIALOUT LINE STATUS ; ; GET/SET REMOTE STATUS ; .IF DF T$$MOD MCRMT:: .IF DF T$$GMC&T$$SMC BNE 100$ ;IF NE, SET NEW REMOTE STATUS .ENDC ;T$$GMC&T$$SMC .IF DF T$$GMC ; ; GET REMOTE STATUS ; CLRB (R1)+ ;ASSUME LINE IS LOCAL BIT #U2.RMT,U.CW2-U.TSTA(R5) ;IS THIS A REMOTE LINE? BEQ 10$ ;IF EQ, NO...ASSUMPTION WAS CORRECT INCB -1(R1) ;ASSUME LINE IS REMOTE BIT #S4.DLO,6(R5) ;IS THIS A DIAL-OUT LINE? BEQ 10$ ;IF EQ, NO...ASSUMPTION WAS CORRECT INCB -1(R1) ;TELL USER LINE IS DIAL-OUT 10$: RETURN ;RETURN FOR NEXT CHARACTERISTIC .ENDC ;T$$GMC .IF DF T$$SMC ; ; SET LINE REMOTE/NOREMOTE/DIAL-OUT. ; ; THE STATE OF THE LINE IS AS FOLLOWS: ; ; LOCAL -> U2.RMT CLEAR, S4.DLO CLEAR, US.DSB CLEAR ; INCOMING CALLS -> U2.RMT SET, S4.DLO CLEAR, US.DSB SET IF NO CALLER ; OUTGOING CALLS -> U2.RMT SET, S4.DLO SET, US.DSB SET IF NO CALLER/CALLEE ; 100$: MOV I.TCB(R3),R0 ;GET ISSUING TASK'S TCB BIT #T3.PRV,T.ST3(R0) ;IS THE TASK PRIVILEGED? BEQ 190$ ;IF EQ, NO...RETURN PRIVILEGE VIOLATION BIT #U2.RMT,U.CW2-U.TSTA(R5) ;DETERMINE REMOTE STATUS OF LINE BNE 110$ ;IF NE, LINE IS REMOTE...SKIP TSTB @R1 ;IS USER SETTING THE LINE REMOTE? BNE 200$ ;IF NE, YES...SKIP TO DO IT INC R1 ;LINE IS ALREADY IN REQUESTED MODE RETURN ;RETURN FOR NEXT CHARACTERISTIC ; ; LINE IS REMOTE OR DIAL-OUT ; 110$: TSTB (R1) ;IS USER SETTING THE LINE LOCAL? BEQ 200$ ;IF EQ, YES...SKIP TO DO IT ; ; RESET OR SWITCH BETWEEN REMOTE AND DIAL-OUT. DON'T HANGUP THE LINE. ; CMPB #1,(R1)+ ;IS USER SETTING THE LINE DIAL-OUT? BNE 120$ ;IF NE, YES...SKIP TO MAKE IT DIAL-OUT BIC #S4.DLO,6(R5) ;SET LINE DIAL-IN ONLY RETURN ;RETURN FOR NEXT CHARACTERISTIC 120$: BIS #S4.DLO,6(R5) ;SET LINE DIAL-OUT RETURN ;RETURN FOR NEXT CHARACTERISTIC ; ; ERROR PROCESSING FOR SET REMOTE OPTIONS ; 190$: TST (SP)+ ;CLEAN RETURN ADDRESS FROM STACK JMP ERCPRI ;RETURN PRIVILEGE VIOLATION ; ; HERE TO DISPATCH ON CONTROLLER TYPE TO CHANGE LINE STATE ; 200$: .IF DF R$$MPL MOV U.SCB-U.TSTA(R5),R0 ;GET SCB MOV S.KRB(R0),R0 ;GET KRB MOVB K.PRM(R0),R0 ;GET CONTROLLER TYPE .IFF ;R$$MPL MOVB U.CTYP-U.TSTA(R5),R0 ;GET CONTROLLER TYPE .ENDC ;R$$MPL ADD R0,PC ;DISPATCH BY CONTROLLER TYPE BR RMTDL ;DL11 BR RMTDZ ;DZ11 BR RMTDH ;DH11 BR RMTDJ ;DJ11 CRASH ;DM11 - SHOULDN'T GET HERE BR RMTDC ;PRO VIDEO INTERFACE BR RMTDV ;DHV11 RETURN ;TTLH (LAT) .IF DF T$$USP ;DC416 BR RMTUS ;USER PORT ;DC416 .IFF ;DF,T$$USP ;DC416 RETURN ;JUST IN CASE ;DC416 .ENDC ;DF,T$$USP ;DC416 .IF DF D$$M11 .IF DF R$$MPL RMTDH: MOV U.SCB-U.TSTA(R5),R0 ;GET SCB MOV S.KRB(R0),R0 ;GET KRB MOVB K.CON(R0),R0 ;GET CONTROLLER INDEX ASRB R0 ;CONVERT TO A COUNT (0 TO N) MOVB R0,-(SP) ;SAVE IT .IF DF T$$SPL!T$$ONI MOV $DALED,KISAR6 ;MAP DRIVER DATA SPACE .ENDC ;T$$SPL!T$$ONI .IF DF T$$ONI MOV YMC12,R0 ;GET POINTER TO DM11-BB KRB LIST .IFF ;T$$ONI MOV YMCP1,R0 ;GET POINTER TO DM11-BB KRB LIST .ENDC ;T$$ONI .IF DF T$$SPL!T$$ONI MOV I.PRM(R3),KISAR6 ;REMAP TASK BUFFER .ENDC ;T$$SPL!T$$ONI CMPB L.NUM-L.KRB(R0),(SP)+ ;IS THIS KRB IN THE LIST? BLOS RMTER ;IF LOS, NO...RETURN AN ERROR .IFF ;R$$MPL RMTDH: MOV U.SCB-U.TSTA(R5),R0 ;GET SCB TST S.DMCS(R0) ;GET DM11-BB CSR BEQ RMTER ;IF EQ, NONE...REPORT AN ERROR .ENDC ;R$$MPL .ENDC ;D$$M11 .IF DF T$$UMD ;DC416 ;DC416 RMTUS: ;DC416 .ENDC ;DF,T$$UMD ;DC416 ;DC416 .IF DF D$$VMD RMTDV: .ENDC ;D$$VMD .IF DF D$$LMD RMTDL: .ENDC ;D$$LMD .IF DF D$$ZMD RMTDZ: .ENDC ;D$$ZMD BIC #U2.RMT,U.CW2-U.TSTA(R5) ;ASSUME SETTING LINE LOCAL BIC #S4.DLO,6(R5) ;CANNOT DIAL OUT EITHER CMPB @R1,#1 ;ASSUMPTION TRUE? BLO 20$ ;IF LO, YES...GO SET IT LOCAL BEQ 15$ ;IF EQ, SET LINE REMOTE BIS #S4.DLO,6(R5) ;SET LINE DIAL-OUT 15$: BIS #U2.RMT,U.CW2-U.TSTA(R5) ;ALLOW INCOMING CALLS 20$: INCB U.TMTI-U.TSTA(R5) ;SET MODEM TIMER BISB #US.CRW,U.STS-U.TSTA(R5) ;SET WAITING FOR CARRIER TSTB (R1)+ ;LINE NOW REMOTE? BNE 30$ ;IF NE, YES...ALL DONE WITH IT BICB #US.DSB,U.STS-U.TSTA(R5) ;LOCAL - ENABLE LINE 30$: RETURN ;RETURN FOR NEXT CHARACTERISTIC ; ; LINE STATUS CANNOT BE CHANGED ; .IF NDF D$$M11 RMTDH: .ENDC ;NDF D$$M11 .IF NDF T$$UMD ;DC416 RMTUS: ;DC416 ;DC416 .ENDC ;NDF,T$$UMD ;DC416 ;DC416 .IF NDF D$$VMD RMTDV: .ENDC ;NDF D$$VMD .IF NDF D$$LMD RMTDL: .ENDC ;NDF D$$LMD .IF NDF D$$ZMD RMTDZ: .ENDC ;NDF D$$ZMD RMTDJ: RMTDC: RMTER: TST (SP)+ ;CLEAN OFF THE STACK JMP ERCNSC ;RETURN NON-SETTABLE CHARACTERISTIC ERROR .ENDC ;T$$SMC .ENDC ;T$$MOD .PAGE .SBTTL . MCSSC - TERMINAL MGMT SWITCH CHARACTERS .IF DF T$$SCA ; ; GET/SET FOR SET SWITCH CHARACTERS ; ; WHEN ISSUED VIA INTERNAL I/O, THE CHARACTERISTIC BUFFER FORMAT IS: ; ; +-------------------------------------+ ; 1 | RESERVED | TC.SSC | 0 ; |-------------------------------------| ; 3 | TEP ADDRESS OR 0 | 2 ; +-------------------------------------+ ; ; THE ASSOCIATED TEP MUST BE PROPERLY FORMATTED WITH THE SWITCH ; CHARACTERS STORED IN OFFSET E.VSWC. ; ; WHEN ISSUED FROM A TASK, THE CHARACTERISTIC BUFFER FORMAT IS: ; ; +-------------------------------------+ ; 1 | RESERVED | TC.SSC | 0 ; |-------------------------------------| ; 3 | AST ADDRESS OR 0 | 2 ; |-------------------------------------| ; 5 | SWITCH CHARACTERS | 4 ; +-------------------------------------+ ; MCSSC:: MOV #U.TSCA,R4 ;SET OFFSET INTO UCBX OF ACB/TEP POINTER .IF DF T$$SMC MOV #S3.TME,R2 ;IDENTIFY FLAG TO ENABLE/DISABLE CHARACTERISTIC MOV #22.,R0 ;SET SIZE OF ACB TO ALLOCATE IF NEEDED .IFTF ;T$$SMC CALL GSAENC ;GET/SET STANDARD ASYNCH EVENT NOTIFICATION ;IT MAY RETURN WITH INTERRUPTS DISABLED .IFT ;T$$SMC .IF DF T$$GMC BVS 100$ ;IF VS, REQUEST WAS SF.GMC...SKIP .ENDC ;T$$GMC ;;;CO-ROUTINE DISABLED INTERRUPTS TIL WE FINISH BNE 10$ ;;;IF NE, WE HAVE AN ACB TO MODIFY TST (R1)+ ;;;ELSE, USER CLEARED CHARACTERISTIC BR 1000$ ;;;RETURN TO GSAENC TO COMPLETE PROCESSING 10$: MOV (R1)+,A.PRM+6(R2) ;;;STORE SWITCH CHARACTERS IN THE ACB .IF DF T$$GMC BR 1000$ ;;;SKIP TO RETURN TO CO-ROUTINE .ENDC ;T$$GMC .ENDC ;T$$SMC .IF DF T$$GMC ; ; GET TERMINAL MANAGEMENT SWITCH CHARACTERS ; 100$: BNE 110$ ;IF NE, WE HAVE AN ACB/TEP...SKIP CLR (R1)+ ;INDICATE SWITCH CHARACTERS ARE DISABLED BR 1000$ ;FINISH OFF REQUEST 110$: .IF DF R$$IIC BCC 120$ ;IF CC, CURRENT SETTING IS FOR AN ACB...SKIP MOV E.VSWC(R2),(R1)+ ;STORE SWITCH CHARACTERS IN USER BUFFER BR 1000$ ;FINISH OFF THE CHARACTERISTIC 120$: .ENDC ;R$$IIC MOV A.PRM+6(R2),(R1)+ ;STORE SWITCH CHARACTERS IN USER BUFFER .ENDC ;T$$GMC 1000$: SUB #2,I.PRM+4(R3) ;CO-ROUTINE PROCESSED 2 MORE BYTES OF BUFFER RETURN ;RETURN TO CO-ROUTINE OR TO GET NEXT CHAR. .PAGE .SBTTL . MCTMM - EXIT TERMINAL MANAGEMENT MODE ; ; GET/SET FOR TERMINAL MANAGEMENT MODE ; ; ; CHARACTERISTIC PACKET FORMAT: ; ; +------------------------+ ; | 0 | TC.TMM | ; +------------------------+ ; MCTMM:: .IF DF T$$GMC&T$$SMC BEQ 2120$ ;GET TERMINAL MANAGEMENT STATUS .ENDC ;T$$GMC!T$$SMC .IF DF T$$SMC ; ; CHECK FOR ERRORS, EITHER TRYING TO ENABLE TM WITH A QIO OR TRYING ; TO EXIT TM WHEN TM IS NOT ACTIVE. ; TSTB (R1)+ ;EXITING TM? BNE 2110$ ;BR IF NOT. CANNOT ENABLE TM WITH QIO BIT #S5.TMM,U.TST5-U.TSTA(R5) ;ARE WE IN TM? BEQ 2110$ ;TRYING TO EXIT WHEN WE'RE NOT IN IT MOV R1,-(SP) ;SAVE REGISTERS OVER KILLI1 MOV R3,-(SP) ; ; MAP UCBX, AND TERMINATE PENDING READS ; .IF DF T$$SPL MOV #120000,R4 ;POINT TO UCBX MOV U.TAPR-U.TSTA(R5),KDSAR5 ;MAP THE UCBX AND TABUF .IFF ;T$$SPL MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPING MOV U.TUX-U.TSTA(R5),R4 ;GET POINTER TO UCBX .IFTF ;T$$SPL MOV #IS.TMM,R0 ;REASON FOR CANCELLED READS .IF DF T$$OVL .IF DF T$$SPL MOV $DALED,KISAR6 .ENDC ;T$$SPL MOV #KILLI1,-(SP) ;GET ADDRESS OF ROUTINE CALL MPROT ;AND GOTO ROUTINE .IFF ;T$$OVL CALL KILLI1 ;TERMINATE PENDING READS .ENDC ;T$$OVL MOV (SP)+,R3 ;RESTORE PACKET ADDRESS MOV (SP)+,R1 ;RESTORE BUFFER POINTER BIC #S5.TMM,U.TST5-U.TSTA(R5) ;CLEAR TERMINAL MANG'T BIT .IF DF R$$IIC BIS #S2.IRQ!S2.ORQ!S2.SRQ,2(R5) ;SET BITS TO POSSIBLY RESTART I/O .ENDC ;R$$IIC .IFF ;T$$SPL MOV I.PRM(R3),KISAR6 ;MAP BACK TO USER BUFFER .ENDC ;T$$SPL RETURN ;RETURN FOR NEXT CHARACTERISTIC .IF DF T$$OVL&T$$SPL MOV I.PRM(R3),KISAR6 ;MAP BACK TO USER BUFFER .ENDC ;T$$OVL&T$$SPL ; ; USER ERROR ; 2110$: JMP ERCVAL ;ILLEGAL VALUE .ENDC ;T$$SMC .IF DF T$$GMC ; ; GET TERMINAL MANAGEMENT MODE STATE ; 2120$: CLRB (R1)+ ;ASSUME TM NOT ACTIVE BIT #S5.TMM,U.TST5-U.TSTA(R5) ;IS TM ACTIVE? BEQ 2130$ ;BR IF NO INCB -1(R1) ;SAY ENABLED 2130$: RETURN ;RETURN FOR NEXT CHARACTERISTIC .ENDC ;T$$GMC .ENDC ;T$$SCA .PAGE .SBTTL . MCMHU - MODEM HANGUP EVENT NOTIFICATION .IF DF T$$MHU ; ; GET/SET FOR MODEM HANG-UP NOTIFICATION ; ; GET/SET PACKET: ; +-------------------------------------+ ; 1 | RESERVED | TC.MHU | 0 ; |-------------------------------------| ; 3 | ADDRESS OF AST (TASK) OR TEP (TSA) | 2 ; +-------------------------------------+ ; MCMHU:: MOV #U.TMHA,R4 ;SET OFFSET INTO UCBX OF ACB/TEP POINTER .IF DF T$$SMC MOV #S3.MHE,R2 ;IDENTIFY FLAG TO ENABLE/DISABLE CHARACTERISTIC MOV #20.,R0 ;SET SIZE OF ACB TO ALLOCATE IF NEEDED .ENDC ;T$$SMC CALL GSAENC ;GET/SET STANDARD ASYNCH EVENT NOTIFICATION RETURN ;RETURN TO GET NEXT CHARACTERISTIC .ENDC ;T$$MHU .PAGE .SBTTL . MCICS - INPUT COUNT STATE EVENT NOTIFICATION .IF DF T$$ICS ; ; GET/SET CHARACTERISTIC BUFFER FORMAT FOR ICS: ; ; +-------------------------------------+ ; 1 | RESERVED | TC.ICS | 0 ; |-------------------------------------| ; 3 | ADDRESS OF AST (TASK) OR TEP (TSA) | 2 ; +-------------------------------------+ ; ; MCICS:: MOV #U.TICA,R4 ;SET OFFSET INTO UCBX OF ACB/TEP POINTER .IF DF T$$SMC MOV #S3.ICE,R2 ;IDENTIFY FLAG TO ENABLE/DISABLE CHARACTERISTIC MOV #20.,R0 ;SET SIZE OF ACB TO ALLOCATE IF NEEDED .ENDC ;T$$SMC CALL GSAENC ;GET/SET STANDARD ASYNCH EVENT NOTIFICATION RETURN ;RETURN FOR NEXT CHARACTERISTIC .ENDC ;T$$ICS .PAGE .SBTTL . MCOOB - OUT-OF-BAND CHARACTER EVENT NOTIFICATION .IF DF T$$OOB ; ; GET/SET OUT-OF-BAND CHARACTERS ; ; WHEN THIS CHARACTERISTIC IS ISSUED VIA INTERNAL I/O, THIS IS THE FORMAT ; OF THE GET/SET CHARACTERISTIC BUFFER: ; ; +-------------------------------------+ ; 1 | RESERVED | TC.OOB | 0 ; |-------------------------------------| ; 3 | OOB TEP ADDRESS OR ZERO | 2 ; +-------------------------------------+ ; ; NOTE THAT THE TEP MUST BE FORMATTED WITH THE BIT MASKS. ; ; WHEN ISSUED FROM A USER TASK, THE CHARACTERISTIC BUFFER FORMAT IS: ; ; +-------------------------------------+ ; 1 | RESERVED | TC.OOB | 0 ; |-------------------------------------| ; 3 | OOB AST VIRTUAL ADDRESS | 2 ; |-------------------------------------| ; 5 | OOB BIT MASK 1 | 4 ; |-------------------------------------| ; 7 | OOB BIT MASK 2 | 6 ; |-------------------------------------| ; 11 | HELLO/CLEAR BIT MASK 1 | 10 ; |-------------------------------------| ; 13 | HELLO/CLEAR BIT MASK 2 | 12 ; |-------------------------------------| ; 15 | INCLUDE BIT MASK 1 | 14 ; |-------------------------------------| ; 17 | INCLUDE BIT MASK 2 | 16 ; +-------------------------------------+ ; ; ; IN HELLO/CLEAR BIT MASKS, 0 => CLEAR OOB; 1 => HELLO OOB. ; CHARACTERS THAT ARE CLEAR OOB CANNOT ALSO BE INCLUDE OOB. ; MCOOB:: MOV #U.TOBA,R4 ;SET OFFSET INTO UCBX OF ACB/TEP POINTER .IF DF T$$SMC CLR R2 ;INDICATE NO FLAG TO ENABLE/DISABLE CHARACTERISTIC MOV #52.,R0 ;SET SIZE OF ACB TO ALLOCATE IF NEEDED .IFTF ;T$$SMC CALL GSAENC ;GET/SET STANDARD ASYNCH EVENT NOTIFICATION ;IT MAY RETURN WITH INTERRUPTS DISABLED .IFT ;T$$SMC .IF DF T$$GMC BVS 100$ ;IF VS, REQUEST WAS SF.GMC...SKIP .ENDC ;T$$GMC ;;;CO-ROUTINE DISABLED INTERRUPTS TIL WE FINISH BNE 10$ ;;;IF NE, WE HAVE AN ACB TO MODIFY ADD #12.,R1 ;;;ELSE, USER CLEARED CHARACTERISTIC BR 1000$ ;;;SKIP FOR RETURN TO CO-ROUTINE 10$: ; ; PERFORM CONSISTENCY CHECKS ON THE OOB BITMASKS SUPPLIED BY THE TASK. THE ; RULES SPECIFY THAT NO CLEAR-OOB CHARACTERS CAN BE INCLUDE-OOB AND THAT ALL ; CLEAR-OOB AND INCLUDE-OOB CHARACTERS MUST BE DECLARED AS OOB CHARACTERS IN ; THE FIRST BITMASK DOUBLEWORD. AN ERROR IN THE FIRST CHECK (CLEAR/INCLUDE ; CONFLICT) WILL LEAVE THE BUFFER POINTER AT THE OFFENDING CLEAR-OOB MASK ; WORD. FAILING THE SECOND CHECK LEAVES THE BUFFER POINTER AT THE OFFENDING ; OOB DECLARATION BITMASK WORD. ; ADD #A.PRM+5,R2 ;;;POINT TO FLAGS CLRB (R2) ;;;INITIALIZE FLAG BYTE BISB #AF.OOB,(R2)+ ;;;SET OOB FLAG AND POINT TO OOB MASK WORD MOV (R1)+,(R2)+ ;;;STORE OOB MASK 1 MOV (R1)+,(R2)+ ;;;STORE OOB MASK 2 MOV (R1)+,(R2)+ ;;;STORE HELLO/CLEAR MASK 1 MOV (R1)+,(R2)+ ;;;STORE HELLO/CLEAR MASK 2 MOV (R1)+,(R2)+ ;;;STORE INCLUDE MASK 1 MOV (R1)+,(R2)+ ;;;STORE INCLUDE MASK 2 CLR (R2)+ ;;;INIT OOB TABUF HEADER CLRB (R2)+ ;;;INIT OOB TABUF ACTIVE COUNT MOVB #10.,(R2) ;;;INIT OOB TABUF SIZE BR 1000$ ;;;SKIP TO RETURN TO CO-ROUTINE 30$: MOV #ERCVL1,2(SP) ;;;FORCE RETURN TO ERROR ROUTINE RETURN ;;;EXIT CO-ROUTINE FOR RETURN TO ERROR ROUTINE .ENDC ;T$$SMC .IF DF T$$GMC ; ; GET OUT-OF-BAND CHARACTER AST AND BITMASKS ; 100$: BNE 110$ ;IF NE, WE HAVE AN ACB/TEP...SKIP CLRB -3(R1) ;CLEAR RESERVED BYTE CLR (R1)+ ;CLEAR FIRST OOB BITMASK CLR (R1)+ ;CLEAR SECOND OOB BITMASK ADD #8.,R1 ;SKIP REST OF BITMASKS BR 1000$ ;FINISH OFF REQUEST 110$: .IF DF R$$IIC BCC 120$ ;IF CC, CURRENT SETTING IS FOR AN ACB...SKIP ; ; WE GET HERE WHEN GET WAS DONE FROM EXTERNAL I/O BUT THE GOTTEN CHARACTERISTIC ; WAS OF THE INTERNAL I/O TYPE ; ADD #E.VOBM,R2 ;POINT TO WHERE OOB BITMASKS START IN A TEP BR 130$ ;FINISH OFF THE CHARACTERISTIC 120$: .ENDC ;R$$IIC ADD #A.PRM+6,R2 ;POINT TO WHERE OOB BITMASKS START IN AN ACB 130$: MOV (R2)+,(R1)+ ;COPY OOB MASK 1 MOV (R2)+,(R1)+ ;COPY OOB MASK 2 MOV (R2)+,(R1)+ ;COPY HELLO/CLEAR MASK 1 MOV (R2)+,(R1)+ ;COPY HELLO/CLEAR MASK 2 MOV (R2)+,(R1)+ ;COPY OOB INCLUDE MASK 1 MOV (R2)+,(R1)+ ;COPY OOB INCLUDE MASK 2 .ENDC ;T$$GMC 1000$: SUB #12.,I.PRM+4(R3) ;CO-ROUTINE PROCESSED 12 MORE BYTES OF BUFFER RETURN ;RETURN TO CO-ROUTINE OR TO GET NEXT CHAR. .ENDC ;T$$OOB .PAGE .IF DF T$$LTH&M$$NET ;THIS IS CONDITIONAL ADDITIONALLY ON ;A NET AS $LTEEP IS NOT DEFINED W/O NET. ;IF THE SYSTEM DOESN'T HAVE A NETWORK, ;THE LAT CODE WON'T EVER EXECUTE .SBTTL . MCMAP - GET/SET MAPPING FOR LAT APPLICATION TERMINAL ; BUFFER FOR ESTABLISHING MAPPING AND ESTABLISHING TERM AS LAT APPLICATION: ; ; +-------------------------------------+ ; |BUFFER SIZE OR 0| TC.MAP | ; |-------------------------------------| ; | UP TO 16. BYTES | ; | FOR SERVER NAME | ; | . | ; |-------------------------------------| ; | SERVICE NAME | ; | . | ; | . | ; |-------------------------------------| ; | PORT NAME | ; | . | ; | . | ; +-------------------------------------+ ; ; WHEN THE BUFFER SIZE IS ZERO, WE ARE VOIDING THE MAPPING AND THE LAT ; APPLICATION TERMINAL STATUS. IN THIS CASE, NO BUFFER FOLLOWS THE WORD ; CONTAINING TC.MAP AND THE 0 BYTE. ELSE, THE BUFFER SIZE MUST BE LESS ; THAN OR EQUAL TO 52. AND MUST BE EVEN. EACH NAME IS ALLOWED TO BE 16. ; BYTES IN LENGTH WITH A TRAILING 0. ; ; SET LAT BY DEFAULT SETS NOBRO AND SLAVE ; SET NOLAT BY DEFAULT CLEARS NOBRO AND SLAVE ; ; MCMAP:: .IF DF T$$GMC!T$$SMC CMPB #52., (R1) ;CORRECT SYNTAX? BLO ERSYN ;IF 52. OR LESS, OK BITB #1,(R1) ;IS IT ODD? BNE ERSYN ;NOT ALLOWED 10$: MOV $CTLST,R2 ;GET FIRST CONTROLLER 15$: CMP U.DCB-U.TSTA(R5),L.DCB(R2) ;IS THIS OUR UNIT? BEQ 20$ ;IF EQ, YES - BRANCH MOV (R2),R2 ;GET NEXT ENTRY BNE 15$ ;IF NE, CHECK IT 17$: TST (SP)+ ;POP RETURN ADDRESS JMP ERCNSC ;PROCESS ERROR ; 20$: CMP L.NAM(R2),#"LH ;SHOULD BE LH CONTROLER BNE 17$ ;IF NOT, BRANCH - MAP NOT LEGAL CMP $LTEEP,#$SPVEX ;IS THERE A RETURN INSTRUCTION ;AT THE LAT ENTRY POINT? BEQ 17$ ;IF SO, LAT IS NOT INSTALLED ; CLR -(SP) MOVB (R1),(SP) ;SAVE SIZE OF BUFFER MOV R3,-(SP) ;SAVE POINTER TO I/O PACKET MOV #PO$MAP,R3 MOV (SP),R0 ;GET IRP ADDRESS TO R0 FOR LAT ;USER BUFFER IN R1 FOR LAT MOV KISAR6,R2 ;GET MAPPING OF USER BUFFER TO R2 FOR LAT MOV KISAR6,-(SP) ;SAVE APR6 MAPPING MOV $DALED,KISAR6 ;MAP DRIVER DATA AREA .IF DF T$$OVL MOV #LTPRC,-(SP) ;GET ADDRESS OF ROUTINE CALL MPROT ;AND GO TO ROUTINE .IFF ;T$$OVL CALL LTPRC ;CALL MAP TO LAT PROCESS .ENDC ;T$$OVL MOV (SP)+,KISAR6 ;RESTORE APR6 MAPPING MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESS MOV (SP)+,R2 ;GET BUFFER LENGTH BACK TST R0 ;DID WE GET AN ERROR BACK FROM LAT? BNE ERLAT ;IF NE, ERROR CMPB #SF.GMC,I.FCN(R3) ;WAS THIS A GET? BEQ 50$ ;IF EQ, YES - RETURN ; ; SET LAT APPLICATION TERMINAL CHARACTERISTICS, BUT NOT ; S6.LAT (LAT PROCESS DOES THIS) ; TSTB (R1) ;LAT OR NOLAT? BEQ 30$ ;EQ -> NOLAT - BRANCH .IF DF R$$MPL!A$$CLI BIS #UM.NBR,U.MUP-U.TSTA(R5) ;SET NOBRO .ENDC ;R$$MPL!A$$CLI BIS #U2.SLV,U.CW2-U.TSTA(R5) ;SET TERMINAL SLAVED BR 50$ ; ; SET NOLAT (S6.LAT CLEARED BY LAT PROCESS) ; 30$: .IF DF R$$MPL!A$$CLI BIC #UM.NBR,U.MUP-U.TSTA(R5) ;SET BROADCAST .ENDC ;R$$MPL!A$$CLI BIC #U2.SLV,U.CW2-U.TSTA(R5) ;SET TERMINAL UNSLAVED ; 50$: INC R1 ;UPDATE BUFFER POINTER ADD R2,R1 ;SKIP OVER BUFFER SUB R2,I.PRM+4(R3) ;ROUTINE PROCESSED BUFFER LEN CHARACTERS RETURN ;DONE .ENDC ;T$$GMC&T$$SMC .PAGE .SBTTL MCQDP - GET CONNECT STATUS/QUEUE DEPTH OF LAT APPLICATION TERM. ; ; SET MULTIPLE CHARACTERISTICS FOR MCQDP IS NOT ALLOWED. ; ; RETURN IS: ; 0 = CONNECTED ; -1 = DISCONNECTED ; 1 -> 255 = QUEUE DEPTH ; MCQDP:: .IF DF T$$GMC&T$$SMC BNE 20$ ;SET (NOT ALLOWED) .ENDC ;T$$GMC&T$$SMC .IF DF T$$GMC MOV $CTLST,R2 ;GET FIRST CONTROLLER 5$: CMP U.DCB-U.TSTA(R5),L.DCB(R2) ;IS THIS OUR UNIT? BEQ 8$ ;IF EQ, YES - BRANCH MOV (R2),R2 ;GET NEXT ENTRY BNE 5$ ;IF NE, CHECK IT ; 7$: BR 20$ ;ERROR, NOT A LAT DEVICE ; 8$: CMP L.NAM(R2),#"LH ;SHOULD BE LH CONTROLER BNE 7$ ;IF NOT, BRANCH - MAP NOT LEGAL CMP $LTEEP,#$SPVEX ;IS THERE A RETURN INSTRUCTION ;AT THE LAT ENTRY POINT? BEQ 20$ ;IF SO, LAT IS NOT INSTALLED ; CALL TO LAT PROCESS WILL INSERT THE QUEUE DEPTH INDICATOR IN THE USER BUFFER 10$: MOV R3,-(SP) ;SAVE POINTER TO I/O PACKET MOV R3,R0 ;GET IRP ADDRESS TO R0 FOR LAT MOV #PO$GQD,R3 MOV KISAR6,-(SP) ;Save APR6 mapping MOV $DALED,KISAR6 ;Map data area in TTCOM MOV (SP),R2 ;SET UP USER BUFFER MAPPING IN R2 .IF DF T$$OVL MOV #LTPRC,-(SP) ;GET ADDRESS OF ROUTINE CALL MPROT ;AND GOTO ROUTINE .IFF ;T$$OVL CALL LTRPC ;CALL MAP TO LAT PROCESS .ENDC ;T$$OVL MOV (SP)+,KISAR6 ;RESTORE APR6 MAPPING MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESS TST R0 ;ERROR? BNE ERLAT ;IF NE, YES RETURN .ENDC ;T$$GMC .IF DF T$$SMC ; SET IS NOT ALLOWED 20$: TST (SP)+ ;POP RETURN ADDRESS JMP ERCNSC ;PROCESS ERROR .ENDC ;T$$SMC .IF DF T$$SMC!T$$GMC ERSYN: JMP ERCVAL ;AND JUMP TO PROCESS ERROR ERLAT: TST (SP)+ ;POP RETURN ADDRESS JMP CHRFN1 ;FINISH I/O .ENDC ;T$$SMC!T$$GMC .ENDC ;T$$LTH&M$$MAP .PAGE .SBTTL TTATT SUBROUTINES .SBTTL . GSAENC - GET/SET GENERAL ASYNCH EVENT NOTIFICATION .IF DF T$$SCA!T$$MHU!T$$ICS!T$$OOB ; ;+ ; **-GSAENC - GET/SET ASYNCHCHRONOUS EVENT NOTIFICATION CHARACTERISTIC ; ; THIS ROUTINE PROCESSES THE COMMON PART OF AN ASYNCHRONOUS ; EVENT NOTIFICATION CHARACTERISTIC. TO SET ONE OF THESE, THE TERMINAL MUST BE ; ATTACHED AND MAY NOT HAVE UNSOLICITED INPUT AST'S SPECIFIED. THIS ROUTINE ; ESTABLISHES AN ACB (UNLESS ONE ALREADY EXISTS) FOR THE REQUESTED CHARACTER- ; ISTIC, SAVES THE USER-SPECIFIED AST ADDRESS IN THE ACB, CALLS THE CALLING ; ROUTINE AS A CO-ROUTINE WITH INTERRUPTS LOCKED OUT TO ALLOW SETTING UP THE ; CHARACTERISTIC DEPENDENT PART OF THE ACB. UPON RETURN FROM THE CO-ROUTINE, ; INTERRUPTS ARE ENABLED AND THE MAIN CHARACTERISTIC HANDLER IS RETURNED TO. ; ; NOTE THAT IF THE CHARACTERISTIC IS BEING SET OR DISABLED VIA AN ; INTERNAL I/O REQUEST, THE CO-ROUTINE SEQUENCE IS NOT EXECUTED AND A RETURN ; TO THE MCXXX DISPATCH ROUTINE (NXTCHR) IS EXECUTED. THIS IS ; BECAUSE THE CHARACTERISTIC BUFFER IS FORMATTED DIFFERENTLY SINCE A TEP ; IS EXPECTED TO ALREADY CONTAIN THE NEEDED CHARACTERISTIC PARAMETERS. ; BY DESIGN, THE CALLING ROUTINE ASSUMES IT WILL NOT GET RETURNED TO. ; ; NOTE THAT AN SF.GMC REQUEST FROM A TASK CAN BE HANDLED EVEN IF THE ; CHARACTERISTIC CURRENTLY HAS A TEP ASSOCIATED WITH IT. IN THIS CASE, ; THE CO-ROUTINE MUST COPY THE CHARACTERISTIC DEPENDENT PARAMETERS FROM THE ; TEP TO THE USER BUFFER. ; ; INPUTS: ; R0 = SIZE OF AN AST CONTROL BLOCK FOR THE CHARACTERISTIC ; R1 => HIGH BYTE OF CURRENT CHARACTERISTIC ENTRY IN USER BUFFER ; R2 = BIT IN STATUS WORD 3 MARKING CHARACTERISTIC AS ENABLED/DISABLED ; R3 => CURRENT I/O PACKET ; R4 = OFFSET TO ACB/TEP POINTER IN THE UCBX ; R5 => U.TSTA OF CURRENT TERMINAL UCB ; ; OUTPUTS: ; WHEN CALLING THE CALLER AS A CO-ROUTINE: ; CC-V = SET IF REQUEST IS SF.GMC; CC-V = CLEAR FOR SF.SMC ; CC-Z = SET IF NO TEP/ACB EXISTS; CC-Z = CLEAR OTHERWISE ; CC-C = SET IF REQUEST IS SF.GMC AND A TEP IS ASSOCIATED WITH ; THE CHARACTERISTIC (ONLY CHECK IF CC-V SET AND CC-Z CLEAR) ; R1 => NEXT WORD OF USER CHARACTERISTIC BUFFER TO PROCESS ; R2 => ACB/TEP FOR THE CHARACTERISTIC ; R4 => UCBX POINTER TO ACB/TEP FOR CHARACTERISTIC ; ; WHEN RETURNING TO CHARACTERISTIC HANDLER: ; R1 => NEXT WORD OF USER CHARACTERISTIC BUFFER TO PROCESS ; ; REGISTERS MODIFIED: NONE. ;- ; GSAENC: INC R1 ;SKIP PAST CHARACTERISTIC HIGH BYTE SUB #2,I.PRM+4(R3) ;ASSUME WE WILL PROCESS 2 BYTES .IF DF T$$GMC&T$$SMC CMPB #SF.GMC,I.FCN(R3) ;IS THIS REQUEST TO GET CHARACTERISTICS BEQ 1000$ ;IF EQ, YES...GET THEM .ENDC ;T$$GMC&T$$SMC .IF DF T$$SMC TST U.ATT-U.TSTA(R5) ;IS TERMINAL ATTACHED? BEQ 900$ ;IF EQ, NO...CAN'T SET CHARACTERISTIC BIT #1,(R1) ;SPECIFYING ODD ADDRESS FOR AST/TEP? BNE 800$ ;ERROR IF ODD MOV (R1)+,-(SP) ;GET REQUESTED AST ADDRESS/TEP POINTER MOV R4,-(SP) ;SAVE OFFSET IN UCBX OF POINTER .IF DF T$$SPL MOV #120000,R4 ;SET POINTER TO UCBX MOV U.TAPR-U.TSTA(R5),KDSAR5 ;MAP UCBX .IFF ;T$$SPL MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPING MOV U.TUX-U.TSTA(R5),R4 ;GET UCBX POINTER .IFTF ;T$$SPL ADD (SP)+,R4 ;POINT TO ACB/TEP POINTER IN UCBX TST (SP) ;ENABLE THE CHARACTERISTIC? BNE 100$ ;IF NE, YES ; ; REQUEST IS TO DISABLE THE CHARACTERISTIC ; BIC R2,4(R5) ;DISABLE THE CHARACTERISTIC CALL DEACB ;DEALLOCATE THE ACB/TEP .IFF ;T$$SPL MOV I.PRM(R3),KISAR6 ;MAP BACK TO USER BUFFER .IFTF ;T$$SPL BIT #1,I.IOSB+4(R3) ;IS THIS AN INTERNAL REQUEST? BEQ 10$ ;IF EQ, NO...THIS IS A USER TASK TST (SP)+ ;CLEAN UP STACK TO SKIP CO-ROUTINE 10$: CLR (SP)+ ;CLEAN STACK, CLEAR CC-V, SET CC-Z RETURN ;RETURN TO CO-ROUTINE OR DISPATCHER ; ; REQUEST IS TO ENABLE ASYNCHRONOUS EVENT NOTIFICATION ; 100$: MTPS #TTPRI ;LOCK OUT INTERRUPTS WHILE CHANGING BIS R2,4(R5) ;;;MARK FUNCTION AS ENABLED .IF DF R$$IIC BIT #1,I.IOSB+4(R3) ;;;INTERNAL I/O REQUEST? BEQ 120$ ;;;IF EQ, NO...MUST BE FROM A TASK CMP (SP),(R4) ;;;INTERNAL REQUEST USING CURRENT TEP? BEQ 110$ ;;;IF EQ, YES...DON'T DEALLOCATE IT CALL DEACB ;;;DEALLOCATE CURRENT TEP/ACB IF ONE 110$: MOV (SP)+,(R4) ;;;STORE NEW TEP POINTER TST (SP)+ ;;;CLEAN STACK .IF NDF T$$SPL MOV I.PRM(R3),KISAR6 ;;;REMAP THE USER BUFFER .ENDC ;NDF T$$SPL BR 150$ ;;;ENABLE INTERRUPTS AND RETURN 120$: .IFTF ;R$$IIC MOV R2,-(SP) ;;;SAVE FUNCTION ENABLE FLAG MOV (R4),R2 ;;;GET CURRENT TEP/ACB .IFT ;R$$IIC BEQ 130$ ;;;IF EQ, NONE...ALLOCATE AN ACB ASSUME A.CBL,E.VSIZ TST A.CBL(R2) ;;;IS THIS AN ACB? BEQ 140$ ;;;IF EQ, YES...JUST CHANGE AST ADDRESS CALL DEACB ;;;DEALLOCATE TEP BEFORE ACB ALLOCATION 130$: .IFF ;R$$IIC BNE 140$ ;;;IF NE, USE EXISTING ONE .ENDC ;R$$IIC MOV R1,-(SP) ;;;SAVE USER BUFFER POINTER MOV R0,R1 ;;;COPY LENGTH OF ACB TO ALLOCATE CALL ALACB ;;;ALLOCATE AN ACB MOV (SP)+,R1 ;;;RESTORE BUFFER POINTER BCS 920$ ;;;IF CS, ALLOCATION FAILURE CLRB (R0)+ ;;;CLEAR ACB FLAG BYTE 140$: BIS (SP)+,4(R5) ;;;SET FLAG TO ENABLE FUNCTION MOV (SP)+,A.AST(R2) ;;;SAVE AST ADDRESS, CLEAR CC-V AND CC-Z .IFF ;T$$SPL MOV I.PRM(R3),KISAR6 ;;;MAP BACK TO USER BUFFER .ENDC ;T$$SPL CALL @(SP)+ ;;;CALL CALLER AS CO-ROUTINE 150$: MTPS #0 ;ENABLE INTERRUPTS RETURN ;BACK TO CALLER ; ; ERROR PROCESSING FOR THE ROUTINE ; 800$: MOV #!,R0 ;ILLEGAL AST ADDRESS BR 905$ 900$: MOV #!,R0 ;ERROR WHEN NOT ATTACHED 905$: CMP (SP)+,(SP)+ ;CLEAN UP THE STACK JMP CHRFIN ;FINISH ERROR 920$: MTPS #0 ;;;RE-ENABLE INTERRUPTS MOV #ERCUPN,R2 ;SET ERROR COMPLETION ROUTINE TST -(R1) ;BACK UP BUFFER POINTER ADD #8.,SP ;CLEAN OFF ALL STACK PARAMETERS JMP (R2) ;PROCESS THE ERROR AND FINISH UP .ENDC ;T$$SMC .IF DF T$$GMC ; ; REQUEST IS TO RETURN CHARACTERISTIC SETTING TO THE USER ; 1000$: .IF DF T$$SPL ADD #120000,R4 ;POINT TO ACB/TEP POINTER IN UCBX MOV U.TAPR-U.TSTA(R5),KDSAR5 ;MAP UCBX .IFF ;T$$SPL MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPING MOV U.TUX-U.TSTA(R5),R2 ;GET UCBX BEQ 1010$ ;IF EQ, NONE...CHARACTERISTIC DISABLED ADD R2,R4 ;POINT TO ACB/TEP POINTER IN UCBX .IFTF ;T$$SPL MOV (R4),R2 ;GET ACB/TEP POINTER IF ONE .IFF ;T$$SPL 1010$: MOV I.PRM(R3),KISAR6 ;MAP BACK TO USER BUFFER .ENDC ;T$$SPL .IF DF R$$IIC BIT #1,I.IOSB+4(R3) ;WAS THIS AN INTERNAL I/O REQUEST? BEQ 1020$ ;IF EQ, NO...RETURN FULL CHARACTERISTIC MOV R2,(R1)+ ;STORE TEP/ACB ADDRESS IN USER BUFFER TST (SP)+ ;CLEAN STACK RETURN ;ALL DONE 1020$: .IFTF ;R$$IIC TST R2 ;IS THERE AN ACB OR TEP? BNE 1030$ ;IF NE, YES...CHECK IT OUT CLR (R1)+ ;AST DISABLED, CLEAR CC-V, SET CC-Z BR 1050$ ;SKIP TO FINISH REQUEST 1030$: .IFT ;R$$IIC ASSUME A.CBL,E.VSIZ TST A.CBL(R2) ;IS THIS AN ACB? (CLEAR CC-C) BEQ 1040$ ;IF EQ, YES MOV R2,(R1)+ ;STORE TEP POINTER IN USER BUFFER SEC ;SET FLAG TO SHOW THIS IS A TEP BR 1050$ ;FINISH REQUEST 1040$: .ENDC ;R$$IIC MOV A.AST(R2),(R1)+ ;STORE AST ADDRESS IN USER BUFFER 1050$: SEV ;SET CC-V TO INDICATE THIS WAS SF.GMC RETURN ;RETURN TO GET CHAR-DEPENDENT STUFF .ENDC ;T$$GMC .ENDC ;T$$SCA!T$$MHU!T$$ICS!T$$OOB .PAGE .SBTTL . MPCCOR - MAP DRIVER DATA AND CALL BACK AS CO-ROUTINE ; ;+ ; **-MPCCOR - MAP DRIVER DATA AREA AND CALL CALLER AS A CO-ROUTINE ; ; THIS ROUTINE WILL MAP THE DRIVER DATA AREA AND CALL BACK THE CALLER AS ; A CO-ROUTINE. WHEN THE CALLER EXECUTES A RETURN, THIS ROUTINE WILL MAP ; BACK TO THE TASK BUFFER AND RETURN. ; ; INPUTS: ; 2(SP) = RETURN ADDRESS AFTER RESTORING TASK BUFFER MAPPING ; R3 => CURRENT I/O PACKET ; ; OUTPUTS: ; CC-C PRESERVED ; NO REGISTERS ARE MODIFIED BY THIS ROUTINE. ;- ; MPCCOR: MOV (SP),-(SP) ;DUPLICATE RETURN ADDRESS ON STACK MOV R3,2(SP) ;SAVE I/O PACKET ADDRESS MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPING CALL @(SP)+ ;CALL CALLER BACK AS A CO-ROUTINE MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESS MOV I.PRM(R3),KISAR6 ;MAP BACK TO USER BUFFER RETURN ;RETURN FROM THE CO-ROUTINE .ENDC ;T$$SMC!T$$GMC .PAGE .SBTTL . ALACB - ALLOCATE AND INITIALIZE AN AST CONTROL BLOCK .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB ; ;+ ; **-ALACB - ALLOCATE AST CONTROL BLOCK ; ; THIS SUBROUTINE ALLOCATES AN AST CONTROL BLOCK AND INITIALIZES THE ; FIXED DATA. DATA THAT IS CHARACTERISTIC-DEPENDENT (SUCH AS A.AST) ; MUST BE SET BY THE CALLER UPON RETURN. ; ; INPUTS: ; R1 = SIZE IN BYTES OF ACB TO ALLOCATE (SAVED IN A.PRM+4) ; R3 => CURRENT I/O PACKET ; R4 => OFFSET IN UCBX WHERE ADDRESS OF ACB WILL BE SAVED ; R5 => U.TSTA OF CURRENT UCB ; ; OUTPUTS: ; CC-C CLEAR IF SUCCESSFUL ALLOCATION; CC-C SET OTHERWISE ; R0 => A.PRM+5 OF THE ALLOCATED ACB ; R2 => LINK WORD OF ALLOCATED ACB (ACB'S HAVE NEGATIVE OFFSETS) ; (R4) => LINK WORD OF ALLOCATED ACB ; ; THE ALLOCATED ACB IS FORMATTED AS FOLLOWS: ; ; +-------------------------------------+ ; | TTDRV KINAR5 BIAS | A.KSR5 (-4) ; |-------------------------------------| ; | DEQUEUE SUBROUTINE ADDRESS (DQACB) | A.DQSR (-2) ; |-------------------------------------| ; | THREAD WORD (0) | (0) ; |-------------------------------------| ; | LENGTH OF CONTROL BLOCK (0) | A.CBL ; |-------------------------------------| ; | # BYTES TO ALLOC ON STACK (16.) | A.BYT ; |-------------------------------------| ; | AST ADDRESS (0) | A.AST ; |-------------------------------------| ; | # AST PARAMETERS (1) | A.NPR ; |-----------------+-------------------| ; | U.TTID | (0) | A.PRM ; |-----------------+-------------------| ; | POINTER TO U.TSTA | A.PRM+2 ; |-----------------+-------------------| ; | | ACB SIZE | A.PRM+4 ; |-----------------+-------------------+ ; ; REGISTERS MODIFIED: R1 ;- ; ALACB: CALL $ALOCB ;ALLOCATE SPACE BCS 10$ ;BR IF ERROR .IF DF T$$OVL .IF DF T$$SPL MOV KISAR6,-(SP) ;SAVE APR6 DATA MAPPING MOV $DALED,KISAR6 ;AND MAP TO DRIVER DATA .IFTF ;T$$SPL MOV ROTMAP,(R0)+ ;INSERT DRIVER MAIN APR 5 MAPPING .IFT ;T$$SPL MOV (SP)+,KISAR6 ;RESTORE EITHER TASK OR DRIVER MAPPING .ENDC ;T$$SPL .IFF ;T$$OVL MOV KINAR5,(R0)+ ;INSERT DRIVER APR 5 MAPPING (A.KSR5) .ENDC ;T$$OVL MOV #DQACB,(R0)+ ;INSERT POINTER TO ROUTINE TO CALL WHEN ;AST BLOCK IS DEQUEUED (A.DQSR) MOV R0,R2 ;SAVE ALLOCATED ACB ADDRESS MOV R0,(R4) ;STORE POINTER TO THE ACB TST (R0)+ ;SKIP OVER LINK WORD CLR (R0)+ ;SET BLOCK LENGTH ZERO TO FORCE SYSXT ;TO CALL US WHEN BLOCK IS DEQUEUED (A.CBL) MOV #16.,(R0)+ ;ALLOCATE 16. BYTES ON TASK'S STACK (A.BYT) TST (R0)+ ;SKIP PAST AST ADDRESS (A.AST) ;THIS WILL BE FILLED IN LATER MOV #1,(R0)+ ;INSERT NUMBER OF AST PARAMETERS (A.NPR) .IF DF T$$SPL CLRB (R0)+ ;SKIP LOW BYTE OF FIRST PARAMETER (A.PRM) MOVB 120000+U.TTID,(R0)+ ;SAVE USER DEFINED TERMINAL ID IN HIGH BYTE .IFF ;T$$SPL CLR (R0)+ ;SKIP OVER FIRST PARAMETER UNTIL LATER (A.PRM) .IFTF ;T$$SPL MOV R5,(R0)+ ;INSERT POINTER TO U.TSTA (A.PRM+2) MOVB R1,(R0)+ ;SAVE SIZE OF THIS ACB (A.PRM+4) .IFF ;T$$SPL MOV U.TUX-U.TSTA(R5),R1 ;GET POINTER TO TOP OF UCBX MOVB U.TTID(R1),-4(R0) ;INSERT USER-DEFINED TERMINAL ID (A.PRM+1) .ENDC ;T$$SPL 10$: RETURN ;ALL DONE .ENDC ;T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB .PAGE .SBTTL . QPEIO - EXTENDED I/O REQUEST ; ;+ ; **-QPEIO - EXTENDED I/O REQUEST (IO.EIO) ; ; THIS ROUTINE VALIDATES THE PARAMETERS OF AN EXTENDED WRITE OR READ REQUEST. ; AN EXTENDED I/O REQUEST IS ONE WITH A FUNCTION CODE OF "IO.EIO" AND A ; SUBFUNCTION OF "TF.WLB" OR "TF.RLB". ALL MODIFIERS AND PARAMETERS OF THE ; REQUEST ARE SET UP IN AN ITEMLIST IN THE USER TASK SPACE INSTEAD OF BEING ; PASSED FROM THE DPB VIA THE I/O PACKET. THIS MAKES IT POSSIBLE TO CREATE ; MORE COMPLEX TYPES OF READS AND WRITES THAN CAN BE DONE BY "OR'ING" ; SUBFUNCTION BITS TOGETHER. FOR EXAMPLE, AN "IO.RPR" REQUEST CANNOT HAVE A ; TERMINATOR TABLE SPECIFIED WITH IT (IO.RTT) SINCE THERE IS NOT ENOUGH ROOM ; IN THE QIO PARAMETER LIST OR IN A NORMAL I/O PACKET FOR THE PROMPT VFC, THE ; TIMEOUT VALUE, AND THE ADDRESS/LENGTH OF THE DATA BUFFERS. AN EXTENDED I/O ; REQUEST ELIMINATES THIS RESTRICTION BY SPECIFYING THE PARAMETERS IN AN ; ITEMLIST POINTED TO BY THE QIO PARAMETER LIST AND BY SAVING ADDITIONAL ; INFORMATION IN AN I/O PACKET EXTENSION. THE USER'S ITEMLIST IS SPECIFIED BY ; "P1" AND "P2" OF THE QIO PARAMETER LIST. THIS BUFFER HAS BEEN ADDRESS- ; CHECKED AND RELOCATED BY THE EXEC AND THE DOUBLEWORD ADDRESS AND LENGTH IS ; STORED IN I.PRM THROUGH I.PRM+4. THE ITEMLIST HAS THE FOLLOWING FORMAT: ; ; READ ITEM LIST: ; ; +-------------------------------+ ; | MODIFIER WORD 1 | ; |-------------------------------| ; | MODIFIER WORD 2 | ; |-------------------------------| ; | ADDRESS OF READ DATA BUFFER | ; |-------------------------------| ; | LENGTH OF READ DATA BUFFER | ; |-------------------------------| ; | TIME OUT VALUE | ; |-------------------------------| ; | ADDRESS OF PROMPT BUFFER | ; |-------------------------------| ; | LENGTH OF PROMPT BUFFER | ; |-------------------------------| ; | PROMPT VFC | ; |-------------------------------| ; | TERMINATOR TABLE ADDRESS | ; |-------------------------------| ; | LENGTH OF TERMINATOR TABLE | ; |-------------------------------| ; | DEFAULT INPUT BUFFER ADDRESS | ; |-------------------------------| ; |LENGTH OF DEFAULT INPUT BUFFER | ; +-------------------------------+ ; ; ; WRITE ITEM LIST: ; ; +-------------------------------+ ; | MODIFIER WORD 1 | ; |-------------------------------| ; | MODIFIER WORD 2 | ; |-------------------------------| ; | ADDRESS OF OUTPUT BUFFER | ; |-------------------------------| ; | LENGTH OF OUTPUT BUFFER | ; |-------------------------------| ; | VFC/CURSOR POSITION | ; +-------------------------------+ ; ; *** NOTE *** ; AT PRESENT, THERE ARE TOO FEW PARAMETERS THAT CAN BE SPECIFIED ON ; EXTENDED WRITE REQUESTS TO JUSTIFY THE ALLOCATION OF AN IOPX FOR ; THEM. THUS, AN "IO.EIO!TF.WLB" REQUEST PACKET IS CONVERTED TO LOOK ; LIKE A NORMAL "IO.WLB". NOTE THAT THIS REQUIRES ALL WRITE MODIFIER ; BITS TO RESIDE IN THE LOW BYTE OF THE ITEMLIST MODIFIER WORD EXCEPT ; TF.FMT WHICH IS SPECIAL CASED. IT COMES TO US VIA THE USER MODIFIER ; WORD OR I.PRM+13 FOR INTERNAL I/O ; ; THE FOLLOWING ACTIONS MAY BE PERFORMED BY THIS ROUTINE: ; 1. VALIDATE THE SIZE OF THE USER-DEFINED ITEMLIST. ; 2. MAKE SURE NO SUBFUNCTIONS OTHER THAN TF.WLB OR TF.RLB ARE REQUESTED. ; 3. CONVERT AN "IO.EIO!TF.WLB" REQUEST INTO A NORMAL "IO.WLB" REQUEST. ; 4. ALLOCATE AN I/O PACKET EXTENSION (IOPX) FROM PRIMARY POOL FOR ; SAVING PARAMETERS FROM THE USER'S ITEMLIST. IF THE IO.EIO ; IS AN INTERNAL I/O REQUEST, I.PRM MUST POINT TO AN IOPX ; ALLOCATED AND SET UP BY THE USER. ; 5. VALIDATE AND ADDRESS CHECK PARAMETERS IN THE USER'S ITEMLIST AND ; SAVE NECESSARY INFORMATION IN THE IOPX. ; 6. LINK THE IOPX INTO A LIST OF IOPX'S FOR THE UCB. ; 7. REQUEST THAT THE I/O PACKET BE LINKED INTO THE TERMINAL'S ; SCB I/O REQUEST QUEUE. ; ; INPUTS: ; R3 => IO.EIO REQUEST PACKET ; R4 => SCB FOR THE TERMINAL ; R5 => UCB FOR THE TERMINAL ; I.PRM => PRE-ALLOCATED IOPX IF IO.EIO IS INTERNAL I/O ; ; OUTPUTS: ; R3 => IO.WLB REQUEST PACKET PASSED TO QPWLB ; R4 = U.TSTA+2 BITS FOR DE-QUEUE BLOCKING (IN "TSTRQ") ; IOPX LINKED INTO IOPX LIST (U.TIXL) ; ; REGISTERS MODIFIED: R0, R1, R2 ;- ; .IF DF T$$EIO .IF DF T$$OVL QPEIO1:: .IFF ;T$$OVL QPEIO:: .ENDC ;T$$OVL .IF DF R$$IIC MOV I.PRM(R3),R0 ;ASSUME THERE IS A PRE-ALLOCATED IOPX BIT #1,I.IOSB+4(R3) ;IS THIS AN INTERNAL I/O REQUEST? BEQ 5$ ;IF EQ, NO ; THIS IS AN INTERNAL I/O REQUEST. BIT #TF.RLB,I.FCN(R3) ;IS THIS A READ? BNE 15$ ;IF YES, IOPX IS ALREADY IN PLACE MOV #IO.WLB,I.FCN(R3);MARK AS A WRITE MOVB I.PRM+12(R3),I.FCN(R3) ;AND SET THE SUBFUNCTIONS .IF DF T$$OVL JMP QPWTRA ;TRANSFER FOR QPWLB .IFF ;T$$OVL JMP QPWLB ;PROCESS IT AS IO.WLB .ENDC ;T$$OVL 5$: MOV R0,KISAR6 ;OTHERWISE, MAP TO USER ITEMLIST BUFFER .IFF ;R$$IIC MOV I.PRM(R3),KISAR6 ;MAP USER ITEMLIST BUFFER .ENDC ;R$$IIC BIT #1,I.PRM+2(R3) ;IS IT WORD ALLIGNED? BNE 11$ ;IF ODD, BRANCH CMP I.PRM+4(R3),#8. ;IS THE SIZE SMALLER THAN THE MINIMUM? BMI 11$ ;IF PL, YES MOV #10.,R0 ;ASSUME CHECKING LENGTH OF TF.WLB ITEMLIST MOV #^C,R1 ;INVERSE OF LEGAL WRITE FLAGS ARE INVALID BIT #TF.WLB,I.FCN(R3) ;IS THIS AN EXTENDED WRITE REQUEST? BNE 10$ ;IF NE, YES...ASSUMPTION WAS CORRECT - SKIP MOV #24.,R0 ;SET LENGTH OF TF.RLB ITEMLIST TO CHECK FOR MOV #^C,R1 ;INVERSE OF EXTENDED READ FLAGS ARE INVALID 10$: CMP R0,I.PRM+4(R3) ;IS THE ITEMLIST TOO LARGE BPL 12$ ;IF PL, NO, CONTINUE 11$: .IF DF T$$OVL MOV #IE.BAD&377,R0 ;GET ERROR CODE JMP 930$ .IFF ;T$$OVL JMP EQPBAD ;ELSE, ERROR .ENDC ;T$$OVL 12$: BIT R1,@I.PRM+2(R3) ;ARE ANY INVALID MODIFIER BITS SET? BNE 25$ ;IF NE, YES...REPORT INVALID FUNCTION ERROR BIT #TF.WLB,I.FCN(R3) ;IS THIS AN EXTENDED WRITE REQUEST? BEQ 20$ ;IF EQ, NO...SKIP TO PROCESS EXTENDED READ ; ; PROCESS AN EXTENDED WRITE REQUEST BY CONVERTING IT TO AN IO.WLB REQUEST. ; MOV I.PRM+2(R3),R2 ;SET POINTER TO START OF USER ITEMLIST MOV #IO.WLB,I.FCN(R3) ;CHANGE FUNCTION CODE OF OUR I/O PACKET MOVB (R2),I.FCN(R3) ;GET THE WRITE REQUEST MODIFIERS CMP (R2)+,(R2)+ ;SKIP HIGH BYTE AND UNUSED MODIFIER WORD MOV (R2)+,R0 ;GET VIRTUAL ADDRESS OF OUTPUT BUFFER MOV (R2)+,R1 ;GET LENGTH OF OUTPUT BUFFER MOV R3,R4 ;COPY I/O PACKET POINTER ADD #I.PRM+4,R4 ;POINT TO WHERE BUFFER LENGTH GOES MOV R1,(R4) ;COPY LENGTH OF SPECIFIED OUTPUT BUFFER MOV (R2),2(R4) ;COPY VFC/CURSOR POSITION INFO TO I/O PACKET CALL CKBFR ;CHECK FOR READ ACCESS AND RELOCATE BUFFER BCS 26$ ;IF CS, CHECK FAILED...RETURN ERROR MOV R2,-(R4) ;SAVE SECOND WORD OF DOUBLEWORD ADDRESS MOV R1,-(R4) ;SAVE FIRST WORD ALSO MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPING .IF DF T$$OVL CALLR QPWTRA ;TRANSFER TO QPWLB .IFF ;T$$OVL JMP QPWLB ;NOW PROCESS PACKET AS NORMAL IO.WLB REQUEST .ENDC ;DF T$$OVL 15$: JMP 50$ ;BRANCH AID ; ; PROCESS AN EXTENDED READ REQUEST BY BUILDING AN IOPX TO HOLD INFO FOR US. ; ASSUME I.XLNK,0 ASSUME I.XLNK+2,I.XIOP ASSUME I.XIOP+2,I.XTCB ASSUME I.XTCB+2,I.XMOD ASSUME I.XMOD+4,I.XRBF ASSUME I.XRBF+4,I.XRBL ASSUME I.XRBL+2,I.XTMO ASSUME I.XTMO+2,I.XPBF ASSUME I.XPBF+4,I.XPBL ASSUME I.XPBL+2,I.XPBV ASSUME I.XPBV+2,I.XTTB ASSUME I.XTTB+4,I.XTTL ASSUME I.XTTL+2,I.XDBF ASSUME I.XDBF+4,I.XDBL 20$: BIT #TF.RLB,I.FCN(R3) ;THIS ISN'T A WRITE, SO IT BETTER BE A READ BNE 27$ ;IF EQ, INVALID FUNCTION ERROR 25$: .IF DF T$$OVL MOV #IE.IFC&377,R0 ;GET ERROR CODE .IFF ;DF T$$OVL JMP EQPIFC ;ELSE, INVALID FUNCTION .ENDC ;DF T$$OVL 26$: JMP 930$ ;ALWAYS NEEDED AS BRANCH STRETCHER ANYWAY. 27$: MOV I.PRM+4(R3),R1 ;GET SPECIFIED EIO BUFFER SIZE MOV @I.PRM+2(R3),R4 ;GET SPECIFIED FUNCTION MASK BIT #TF.RDI,R4 ;READ W/ DEFAULT INPUT? BEQ 272$ ;BR IF NO RDI CMP R1,#24. ;IF RDI, MAKE SURE ALL 24. BYTES THERE BNE 11$ ;IF LESS, ERROR BR 29$ ;ELSE, OK CONTINUE 272$: BIT #TF.RTT,R4 ;READ W/ TERMINATOR TABLE? BEQ 274$ ;BR IF NO RTT CMP R1,#20. ;IF RTT, CHECK MIN. REQUIRED BYTES THERE BMI 11$ ;IF LESS, ERROR BR 29$ 274$: .IF DF T$$RPR BIT #TF.RPR,R4 ;READ W/ PROMPT? BEQ 276$ ;BR IF NO RPR CMP R1,#14. ;CHECK MINIMUM REQUIRED BYTES SPECIFIED BMI 11$ ;IF LESS, ERROR BR 29$ 276$: .ENDC ; DF T$$RPR BIT #TF.TMO,R4 ;READ W/ TIMEOUT? BEQ 29$ ;BR IF NOT CMP R1,#10. ;CHECK ALL BYTES SPECIFIED BMI 11$ ;IF LESS, ERROR 29$: MOV #I.XLEN,R1 ;SET SIZE OF AN I/O PACKET EXTENSION (IOPX) CALL $ALOCB ;ALLOCATE IOPX FROM PRIMARY POOL (IOPX IN... ; ...DRIVER POOL IS A MAPPING NIGHTMARE!) BCS 910$ ;IF CS, NO FREE POOL...GIVE UP MOV R0,R4 ;COPY IOPX ADDRESS MOV R3,-(SP) ;SAVE CURRENT I/O PACKET (IO.EIO) ADDRESS MOV R0,-(SP) ;AND SAVE IOPX ADDRESS ; ; INITIALIZE AN IOPX FOR AN EXTENDED READ REQUEST. ; TST (R4)+ ;SKIP PAST LINK WORD MOV R3,(R4)+ ;FILL IN ASSOCIATED I/O PACKET ADDRESS MOV I.TCB(R3),(R4)+ ;FILL IN TASK TCB ADDRESS MOV I.PRM+2(R3),R3 ;USE R3 AS A POINTER INTO THE ITEMLIST MOV (R3)+,(R4)+ ;SAVE FUNCTION MODIFIERS IN IOPX MOV (R3)+,(R4)+ ;MOVE UNUSED MODIFIER WORD MOV (R3)+,R0 ;GET VIRTUAL ADDRESS OF READ DATA BUFFER MOV (R3),R1 ;GET BUFFER SIZE CALL CKBFB ;CHECK FOR READ ACCESS AND RELOCATE BUFFER BCS 920$ ;IF CS, CHECK FAILED...RETURN ERROR MOV R1,(R4)+ ;SAVE FIRST WORD OF ADDRESS DOUBLEWORD MOV R2,(R4)+ ;SAVE SECOND WORD OF ADDRESS DOUBLEWORD MOV (R3)+,(R4)+ ;SAVE LENGTH OF READ BUFFER MOV (R3)+,(R4)+ ;SAVE TIMEOUT VALUE IN IOPX .IF DF T$$RPR MOV (R3),R0 ;GET VIRTUAL ADDRESS OF PROMPT BUFFER MOV 2(R3),R1 ;GET PROMPT BUFFER SIZE BIT #TF.RPR,-14(R4) ;EXTENDED READ W/PROMPT FUNCTION? BEQ 30$ ;IF EQ, NO...SKIP CALL CKBFR ;CHECK FOR READ ACCESS AND RELOCATE BUFFER BCS 920$ ;IF CS, CHECK FAILED...RETURN ERROR MOV R1,(R4)+ ;SAVE FIRST WORD OF ADDRESS DOUBLEWORD MOV R2,(R4)+ ;SAVE SECOND WORD OF ADDRESS DOUBLEWORD TST (R3)+ ;POINT TO THE LENGTH MOV (R3)+,(R4)+ ;SAVE LENGTH OF PROMPT BUFFER MOV (R3)+,(R4)+ ;SAVE PROMPT VFC IN IOPX BR 33$ 30$: .ENDC ;T$$RPR ADD #6.,R3 ;SKIP PAST UNUSED ITEMLIST OFFSETS ADD #8.,R4 ;SKIP PAST UNUSED IOPX OFFSETS 33$: BIT #TF.RTT,-24(R4) ;READ W/TERMINATOR TABLE SPECIFIED? BEQ 35$ ;IF EQ, NO...SKIP ; BIT #TF.PTT,-24(R4) ;WANT TO USE PREVIOUS TERMINATOR TABLE? ; BNE 35$ ;IF NE, YES...DON'T BOTHER TO CHECK TABLE PARAM. MOV (R3)+,R0 ;GET ADDRESS OF TERMINATOR TABLE MOV (R3),R1 ;GET LENGTH OF TERMINATOR TABLE CALL CKBFR ;CHECK FOR READ ACCESS AND RELOCATE BUFFER BCS 920$ ;IF CS, CHECK FAILED...RETURN THE ERROR MOV R1,(R4)+ ;COPY FIRST WORD OF ADDRESS DOUBLEWORD MOV R2,(R4)+ ;COPY LAST WORD OF ADDRESS DOUBLEWORD MOV (R3)+,(R4)+ ;COPY LENGTH OF TERMINATOR TABLE BR 37$ ;BRANCH SINCE POINTERS ARE ALREADY CORRECT 35$: CMP (R3)+,(R3)+ ;SKIP PAST UNUSED ITEMLIST OFFSETS ADD #6,R4 ;SKIP PAST UNUSED IOPX OFFSETS 37$: BIT #TF.RDI,I.XMOD-I.XDBF(R4) ;READ WITH DEFAULT INPUT SPECIFIED? BEQ 40$ ;IF EQ NO MOV (R3)+,R0 ;GET VIRTUAL ADDRESS OF DEFAULT INPUT BUFFER MOV (R3),R1 ;GET DEFAULT INPUT BUFFER LENGTH CALL CKBFR ;CHECK FOR READ ACCESS AND RELOCATE BUFFER BCS 920$ ;IF CS, CHECK FAILED...RETURN ERROR MOV R1,(R4)+ ;SAVE FIRST WORD OF ADDRESS DOUBLEWORD MOV R2,(R4)+ ;SAVE SECOND WORD OF ADDRESS DOUBELWORD MOV (R3)+,(R4)+ ;SAVE LENGTH OF DEFAULT INPUT BUFFER ; ; EXTENDED READ ITEMLIST PARAMETERS HAVE BEEN VALIDATED. ; 40$: MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPING MOV (SP)+,R0 ;RETRIEVE IOPX POINTER MOV (SP)+,R3 ;RESTORE IO.EIO PACKET POINTER ; ; LINK THE CURRENT IOPX INTO THE U.TIXL LIST FOR THE TERMINAL. ; 50$: MOV U.TIXL(R5),(R0) ;POINT THIS IOPX TO FIRST IOPX IN LIST, IF ANY MOV R0,U.TIXL(R5) ;THIS IOPX NOW BECOMES THE FIRST IN THE LIST MOV #S2.IRQ,R4 ;READS MUST BLOCK IF INPUT IS ACTIVE .IF DF T$$RPR BIT #TF.RPR,I.XMOD(R0);WAS READ W/PROMPT SPECIFIED? BEQ 60$ ;IF EQ, NO...ALL CHECKING COMPLETED MOV #S2.IRQ!S2.ORQ,R4 ;PROMPT MUST BLOCK IF ACTIVE INPUT OR OUTPUT 60$: .ENDC ;T$$RPR .IF DF T$$OVL JMP QUETRA ;TRANSFER TO QUEUE .IFF ;DF T$$OVL JMP QUEUE ;QUEUE THE REQUEST .ENDC ;DF T$$OVL ; ; ERROR PROCESSING FOR EXTENDED I/O REQUESTS. ; 910$: MOV #IE.NOD&377,R0 ;SET ERROR FOR NO NODES AVAILABLE BR 930$ ;RETURN ERROR (REMAP DRIVER ON THE WAY) 920$: MOV R0,R4 ;SAVE ERROR COMPLETION STATUS MOV (SP)+,R0 ;RETREIVE IOPX ADDRESS MOV #I.XLEN,R1 ;GET SIZE OF IOPX CALL $DEACB ;DEALLOCATE THE IOPX MOV (SP)+,R3 ;RETRIEVE I/O PACKET ADDRESS MOV R4,R0 ;RESTORE COMPLETION STATUS 930$: .IF DF T$$OVL ;IF THE DRIVER IS OVERLAID MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPING CLR R1 ;INPUT TO $IOFIN CALLR $IOFIN ;FINISH REQUEST .IFF ;DF T$$OVL JMP EQPFIN ;FINISH THE I/O REQUEST WITH THE ERROR .IFT ;T$$OVL .PAGE .SBTTL . BUFFER ADDRESS CHECKING AND RELOCATION ROUTINES ; ;+ ; **-CKBFR - ADDRESS CHECK BUFFER FOR READ ACCESS ; **-CKBFB - ADDRESS CHECK BUFFER FOR READ/WRITE ACCESS ; ; THESE ROUTINES PERFORM THE DESCRIBED ADDRESS CHECKING ON A USER BUFFER. ; ; NOTE: THIS CODE IS DUPLICATED FROM TTINI IN THE OVERLAID/EXTENDED I/O ; DRIVER DUE TO MAPPING CONSIDERATIONS. THE CODE MUST RUN IN APR5 BUT ; CAN'T BE EASILY TRANSFERRED TO FROM THE OVERLAY SINCE DATA APR6 IS ; NOT MAPPED TO THE DRIVER'S DATA, BUT TO THE USER BUFFER. ; ; INPUTS: ; R0 => USER BUFFER (VIRTUAL ADDRESS) ; R1 = LENGTH OF USER BUFFER ; ; OUTPUTS: ; CC-C = 0 IF ADDRESS CHECK WAS SUCCESSFUL ; CC-C = 1 IF ADDRESS CHECK FAILED ; R0 = ERROR CODE FOR ADDRESS CHECK FAILURE REASON: ; "IE.SPC" IF SPECIFIED BUFFER LENGTH IS ZERO ; "IE.SPC" IF BUFFER NOT WORD ALIGNED OR EXEC ADDRESS CHECK FAILS ; "IE.BAD" IF BUFFER SIZE IS GREATER THAN 8128. BYTES ; R1 = BIAS OF RELOCATED USER BUFFER ADDRESS ; R2 = DISPLACEMENT OF RELOCATED USER BUFFER ADDRESS ; ; REGISTERS MODIFIED: R0 ;- ; .IF DF A$$CHK .ENABL LSB CKBFR: .IF DF R$$MPL MOV #$CKBFR,-(SP) ;SET UP CALL FOR READ-ACCESS CHECK BR 10$ ;SKIP TO COMMON CODE .IFTF ;R$$MPL CKBFB: .IFT ;R$$MPL MOV #$CKBFB,-(SP) ;SET UP CALL FOR WRITE-ACCESS CHECK 10$: .IFTF ;R$$MPL TST R1 ;IS BUFFER SIZE VALID? BEQ 900$ ;IF EQ, NO...RETURN INVALID BUFFER ERROR CMP R1,#20000-100 ;IS BUFFER BIGGER THAN 8128. BYTES? BHI 920$ ;IF HI, YES...RETURN BAD BUFFER SIZE ERROR .IFT ;R$$MPL .IF DF X$$HDR MOV (SP),-(SP) ;DUPLICATE MAPPING ROUTINE ADDRESS ON STACK MOV KISAR6,2(SP) ;SAVE CURRENT EXEC MAPPING MOV $SAHDB,KISAR6 ;MAP CURRENT TASK HEADER .IFTF ;X$$HDR CALL @(SP)+ ;CALL REQUESTED ADDRESS CHECK ROUTINE .IFT ;X$$HDR MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPING .ENDC ;X$$HDR .IFF ;R$$MPL CALL $ACHKB ;DO NORMAL ADDRESS CHECKING .ENDC ;R$$MPL BCS 910$ ;IF CS, IT FAILED...RETURN ERROR .IFF ;A$$CHK CKBFR: CKBFB: .IFTF ;A$$CHK CALL $RELOC ;RELOCATE ADDRESS AND CONVERT TO DOUBLEWORD RETURN ;ALL DONE .IFT ;A$$CHK 900$: .IIF DF R$$MPL, TST (SP)+ ;POP OFF CO-ROUTINE ADDRESS 910$: MOV #IE.SPC&377,R0 ;SET COMPLETION ERROR CODE FOR INVALID BUFFER BR 990$ ;SKIP 920$: .IIF DF R$$MPL, TST (SP)+ ;POP OFF CO-ROUTINE ADDRESS MOV #IE.BAD&377,R0 ;SET COMPLETION ERROR CODE FOR BAD SIZE 990$: SEC ;RETURN WITH ERROR FLAG RETURN ;ALL DONE .DSABL LSB .ENDC ;A$$CHK .ENDC ;T$$OVL .ENDC ;T$$EIO .END